栈之顺序栈

来源:互联网 发布:大数据最重要的职位 编辑:程序博客网 时间:2024/05/22 01:54

我是辛勤的小蜜蜂~~~哈哈~~大笑码代码坐等比赛开始,我猜今晚皇马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 0
原创粉丝点击