实现顺序栈的出栈,取栈顶元素操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//实现顺序栈的出栈,取栈顶元素操作
#include
#include
#include
#include
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status;
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
typedef int SElemType;
//栈的顺序存储结构
typedef struct SqStack{
SElemType*base;
SElemType*top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s){//初始化栈
s.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));//申请连续的存储空间
if(! s.base)
exit(OVERFLOW);
s.top=s.base;//栈顶指针指向基地址
s.stacksize=STACK_INIT_SIZE;//申请空间的大小
return OK;
}
Status Push(SqStack &s,SElemType e){//插入e为新的栈顶元素
if(s.top-s.base>=s.stacksize){//栈已满,申请更大的存储空间
s.base=(SElemType*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!s.base)//没有更大的存储空间,返回出错信息
exit(OVERFLOW);
s.top=s.base+s.stacksize;//栈顶指针指向新空间的栈顶元素
s.stacksize+=STACK_INCREMENT;// 新空间的大小
}
*(s.top)++=e;//插入元素e为栈顶元素,同时栈顶指针后移
return OK;
}
Status GetPop(SqStack &S, SElemType &e)//取栈顶元素操作
{//若栈不空,则由e返回栈顶元素,并返回ok,否则返回ERROR
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}
Status Pop (SqStack &S, SElemType &e) {//出栈算法
// 若栈不空,则删除S的栈顶元素,
// 用e返回其值,并返回OK;
// 否则返回ERROR
if (S.top == S.base) return ERROR;
e = *--S.top;
//先将栈顶指针指向当前栈顶元素,并将其赋给e
return OK;
}
void StackTraverse(SqStack s){//输出栈中元素
SElemType*q=s.base;
while(s.top>q)
printf("%d ",*(q++));
printf("\n");
}
void main(){//主函数
int n,e,i;
SqStack s;
InitStack(s);//初始化栈
printf("请输入栈的长度n\n");
scanf("%d",&n);
printf("请输入%d个数据\n",n);
for(i=1;i<=n;i++){
scanf("%d",&e);
Push(s,e);//入栈
}
printf("\n");
printf("s=");
StackTraverse(s);//栈的遍历
GetPop(s,e);
Pop(s,e);
printf("取过栈顶后:\n");
printf("s=");
StackTraverse(s);
printf("栈顶元素为:%d\n",e);
}