顺序栈的表示与实现
顺序栈的基本函数
初始化
入栈
出栈
取栈顶元素
需要注意的是,本文代码采用了c++的一些语法,得使用cpp文件,才能运行成功。
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define maxsize 100
typedef int status;//使后面可以使用status类型,用来表示成功或失败状态
#define ERROR -1
#define OK 1
typedef struct
{
char *base;
char *top;
int stacksize;
}sqstack;
status init(sqstack &S)
{//顺序栈的初始化
S.base=new char[10];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=maxsize;
return OK;
}
status push(sqstack &S,char e)//顺序栈入栈
{//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize) return ERROR;
*S.top++=e; return OK;
}
status pop(sqstack &S,char &e)//顺序栈出栈
{//删除S的栈顶元素,用e返回其值
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
char gettop(sqstack S)//取栈顶元素
{//返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base)
return *(S.top-1);
}
//status StackTraverse(sqstack S)
//{
从栈顶到栈底依次输出栈中的每个元素
// char *p,*q ;
// p =S.top;
// q = S.base;
// if(p==q)printf("The Stack is Empty!");//判断栈是否为空
// else
// {
// printf("The Stack is: ");
// p--;
// while(p>=S.base)
// {
// printf("%c ", *p);
// p--;
// }
// }
// printf("\n");
// return OK;
//}
status StackTraverse(sqstack S)
{
// 从栈顶到栈底依次输出栈中的每个元素
if(S.top==S.base)printf("The Stack is Empty!");//判断栈是否为空
else
{
printf("The Stack is: ");
S.top--;
while(S.top>=S.base)
{
printf("%c ", *S.top);
S.top--;
}
}
printf("\n");
return OK;
}
void choose()
{
printf("命令展示\n");
printf("1:展示栈顶元素\n");
printf("2:插入新元素\n");
printf("3:删除栈顶元素\n");
printf("4:展示栈元素\n");
printf("5:退出\n");
}
void order(sqstack S)
{
int n;char e;
choose();
printf("请问你想选择的功能\n");
scanf("%d",&n);
switch(n)
{
case 1: e=gettop(S);printf("栈顶元素是:%c\n",e);order(S);break;
case 2: {
printf("请输入你要插入的元素:\n");
scanf("%s",&e);
push(S,e);order(S);break;
}
case 3: {
printf("返回的被删除栈顶元素:");
pop(S,e);printf("%c\n",e);
order(S);break;
}
case 4:StackTraverse(S);order(S);break;
case 5: exit(0);break;
default:exit(0);
}
}
int main()
{
sqstack S;
init(S);
push(S,'a');push(S,'b');push(S,'c');push(S,'d');push(S,'e');
order(S);
return 0;
}
代码当中的StackTtraverse()有2种写法,均可以使用。
输出
输入
2
s
2
g
4