c语言关于栈的基本操作

直接附上栈的初始化,入栈,遍历栈,求栈长的操作


#include<stdio.h>
#include<stdlib.h>
#define OK       1
#define ERROR    0
#define STACK_INIT_SIZE  3
#define STACKINCREMENT   3
typedef int SElemType;
typedef int Status;
typedef struct{
    SElemType *top;
    SElemType *base;
    int stacksize;
}sqStack;
//判单栈空
bool StackFull(sqStack *s){
    if(s->top - s->base >= s->stacksize)
        return true;
    else
        return false;
}
//初始化栈
Status StackInit(sqStack *s){
    s->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

    if(!s->base){
        return ERROR;
    }
    s->top = s->base;
    s->stacksize = STACK_INIT_SIZE;
    return OK;
}
//入栈
void Push(sqStack *s,SElemType e){
    if(StackFull(s)){
        printf("栈满,");
        s->base = (SElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!s->base)
            exit(0);
        printf("动态增容3\n");
        s->top = s->base + s->stacksize;
        s->stacksize = s->stacksize + STACKINCREMENT;
    }
    *(s->top) = e;
    s->top++;
}
//从顶部遍历
void StackTraverse(sqStack *s){
    SElemType *p;
    p = s->top;
    while(p>s->base){
        p--;
        printf("%d  ",*p);
    }
}
//从底部遍历
void StackBaseTraverse(sqStack &s){//....
    SElemType *p;
    p = s.base;
    while(p<s.top){
        printf("%d  ",*(p++));
    }
}
/*void print(SElemType c){
    printf("%d",c);

}
void StakTraverse(sqStack *s,void(*Visit)(SElemType)){
    if(s->top > s->base)
        Visit(*(s->base++));

}*/
//栈的长度
int StackLength(sqStack *s){
    return s->top - s->base;
}
int main(){
    sqStack s;
    SElemType e;
    StackInit(&s);
    int i = 2;
    printf("当输入0时,(0不算元素)输入终止...\n");
    printf("请输入第1个栈的值:\n");
    while(scanf("%d",&e)!=EOF && e != 0){
        Push(&s,e);
        printf("请输入第%d个栈的值:\n",i);
        i++;
    }
    int len;
    len = StackLength(&s);
    printf("0未读入栈\n");
    printf("栈的长度为%d\n",len);
    printf("从栈顶开始遍历:\n");
    StackTraverse(&s);
    //StackTraverse(&s,print);
    printf("\n");
    printf("从底部循环遍历的值是:\n");
    StackBaseTraverse(s);
    return 0;
}

#include<stdio.h>
#include<stdlib.h>
#define OK       1
#define ERROR    0
#define STACK_INIT_SIZE  3
#define STACKINCREMENT   3
typedef int SElemType;
typedef int Status;
typedef struct{
    SElemType *top;
    SElemType *base;
    int stacksize;
}sqStack;
bool StackFull(sqStack &s){
    if(s.top - s.base >= s.stacksize)
        return true;
    else
        return false;
}
Status StackInit(sqStack &s){
    s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!s.base)
        return ERROR;
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
    return OK;
}
void Push(sqStack &s,SElemType e){
    if(StackFull(s)){
        printf("栈满,");
        s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT) *sizeof(SElemType));
        if(!s.base)
            exit(0);
        printf("动态增容3\n");
        s.top = s.base + s.stacksize;
        s.stacksize = s.stacksize + STACKINCREMENT;
    }
    *s.top = e;
    s.top++;
}
void StackTraverse(sqStack &s){
    SElemType *p;
    p = s.top;
    printf("从顶部循环遍历的值是:\n");
    while(p>s.base){
        p--;
        printf("%d  ",*p);
    }
}
void StackBaseTraverse(sqStack &s){
    SElemType *p;
    p = s.base;
    while(p<s.top){
        printf("%d  ",*(p++));
    }
}
/*
void print(SElemType c)
{
    printf("%d ",c);
}
void StackTraverse(sqStack &s,void(*Visit)(SElemType)){
    while(s.top > s.base)
        Visit(*(s.base)++);
}


*/
int StackLength(sqStack &s){
    return s.top - s.base;
}
int main(){
    sqStack s;
    SElemType e;
    StackInit(s);
    int i = 2;
    printf("当输入0时,(0不算元素)输入终止...\n");
    printf("请输入栈的第1个元素值:\n");
    while(scanf("%d",&e)!=EOF && e!= 0){
        Push(s,e);
        printf("请输入栈的第%d个值:\n",i);
        i++;
    }
    int len = 0;
    len = StackLength(s);
    printf("栈的长度为:%d\n",len);
    StackTraverse(s);
    //StackTraverse(s,print);//与上面注释部分一起用
    printf("\n");
    printf("从底部循环遍历的值是:\n");
    StackBaseTraverse(s);
    return 0;

}

还有一个操作:

运行结果:

当输入0时,(0不算元素)输入终止...
请输入第1个栈的值:
1
请输入第2个栈的值:
2
请输入第3个栈的值:
3
请输入第4个栈的值:
4
栈满,动态增容3
请输入第5个栈的值:
5
请输入第6个栈的值:
0
0未读入栈
栈的长度为5
从栈顶开始遍历:
5  4  3  2  1
从底部循环遍历的值是:
1  2  3  4  5
Process returned 0 (0x0)   execution time : 5.826 s
Press any key to continue.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值