栈之顺序栈

我是辛勤的小蜜蜂~~~哈哈~~大笑码代码坐等比赛开始,我猜今晚皇马5:1大胜塞维利亚奋斗

下面来介绍下顺序栈。我们知道,栈具有一个栈顶指针,有些教材中的顺序栈的栈顶指针指向栈顶元素的下一个位置,但本文中的栈顶指针都指向栈顶元素。其中,S->data[0]是栈底元素,top是栈顶指针。

#include<cstdio>
#define StackSize 100             //假定预分配的栈空间最多为100个元素

typedef char Datatype;            //假定栈元素的数据类型为字符
typedef struct {
    Datatype data[StackSize];
    int top;
}SeqStack;

//********************************栈的一些基本操作**********************************

void InitStack(SeqStack *S){
    将顺序栈置空
    S->top=-1;
}

int StackEmpty(SeqStack *S){
    //判断顺序栈是否为空,若为空,则返回真,否则返回假
    return S->top==-1;
}

int StackFull(SeqStack *S){
    //判断栈是否满了,若满了则返回真,否则返回假
    return S->top==StackSize-1;
}

void Push(SeqStack *S,Datatype x){
    //进栈操作
    if(StackFull(S)){
        printf("Stack overflow\n");     //上溢,退出运行
        return ;
    }
    S->data[++S->top]=x;                 //将栈顶指针加1后讲x入栈
}

void Pop(SeqStack *S){
    //出栈操作
    if(StackEmpty(S)){
        printf("Stack underflow\n");    //下溢,退出运行
        return ;
    }
    S->top--;                           //将栈顶指针减1
}

Datatype StackTop(SeqStack *S){
    //取栈顶元素
    if(StackEmpty(S)){                  //栈空则无法取栈顶元素
        printf("Stack is empty!\n");
        return '?';
    }
    return S->data[S->top];
}

void CreateStack(SeqStack *S){
    //建立一个栈
    char ch;
    while((ch=getchar())!='\n'){
        Push(S,ch);
    }
    return ;
}

//***********************************测试函数********************************

int main(){
    SeqStack *S;
    InitStack(S);
    printf("输入一个字符串,来建立一个字符顺序栈:\n");
    CreateStack(S);
    printf("栈已建好!\n");
    printf("栈顶元素是:%c\n",StackTop(S));
    printf("弹出栈顶元素:\n");
    Pop(S);
    printf("此时栈顶元素为:%c\n",StackTop(S));
    printf("将元素‘Z’进栈:\n");
    Push(S,'z');
    printf("此时栈顶元素是:%c\n",StackTop(S));
    return 0;
}

测试样例:


设想如果将数组的一端固定,看做栈底,另一端看做活动的,那么我们可以用数组来模拟顺序栈,具体代码如下。此时的指针相当于数组的指标。但此时对于多个栈的情况,处理起来不太方便,而且以下代码不具有很好的封装性。程序的具体运行样例与上一段代码相同,就不再贴出了。错误之处,还请指出!

#include<cstdio>
#define StackSize 100             //假定预分配的栈空间最多为100个元素

typedef char Datatype;            //假定栈元素的数据类型为字符
int top;                          //栈顶指针,这里是全局变量,不太好

//********************************栈的一些基本操作**********************************

void InitStack(){
    //将顺序栈置空
    top=-1;
}

int StackEmpty(){
    //判断顺序栈是否为空,若为空,则返回真,否则返回假
    return top==-1;
}

int StackFull(){
    //判断栈是否满了,若满了则返回真,否则返回假
    return top==StackSize-1;
}

void Push(Datatype *S,Datatype x){
    //进栈操作
    if(StackFull()){
        printf("Stack overflow\n");     //上溢,退出运行
        return ;
    }
    S[++top]=x;                     //将栈顶指针加1后讲x入栈
}

void Pop(){
    //出栈操作
    if(StackEmpty()){
        printf("Stack underflow\n");    //下溢,退出运行
        return ;
    }
    top--;                              //将栈顶指针减1
}

Datatype StackTop(Datatype *S){
    //取栈顶元素
    if(StackEmpty()){                  //栈空则无法取栈顶元素
        printf("Stack is empty!\n");
        return '?';
    }
    return S[top];
}

void CreateStack(Datatype *S){
    //建立一个栈
    char ch;
    while((ch=getchar())!='\n'){
        Push(S,ch);
    }
    return ;
}

//***********************************测试函数********************************

int main(){
    Datatype Stack[StackSize];
    InitStack();
    printf("输入一个字符串,来建立一个字符顺序栈:\n");
    CreateStack(Stack);
    printf("栈已建好!\n");
    printf("栈顶元素是:%c\n",StackTop(Stack));
    printf("弹出栈顶元素:\n");
    Pop();
    printf("此时栈顶元素为:%c\n",StackTop(Stack));
    printf("将元素‘Z’进栈:\n");
    Push(Stack,'z');
    printf("此时栈顶元素是:%c\n",StackTop(Stack));
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值