7-1 栈的实现及基本操作
给定一个初始为空的栈和一系列压栈、弹栈操作,请编写程序输出每次弹栈的元素。栈的元素值均为整数。
输入格式:
输入第1行为1个正整数n,表示操作个数;接下来n行,每行表示一个操作,格式为1 d或0。1 d表示将整数d压栈,0表示弹栈。n不超过20000。
输出格式:
按顺序输出每次弹栈的元素,每个元素一行。若某弹栈操作不合法(如在栈空时弹栈),则对该操作输出invalid。
输入样例:
在这里给出一组输入。例如:
7
1 1
1 2
0
0
0
1 3
0
输出样例:
在这里给出相应的输出。例如:
2
1
invalid
3
代码实现
#include<iostream>usingnamespacestd; #defineERROR0#defineOK1#defineMAXSIZE20000typedefintSElemType; typedefintStatus; typedefstruct{ SElemType*top; SElemType*base; intstackSize; }SqStack; StatusInitStack(SqStack&S){ S.base=newSElemType[MAXSIZE]; if(!S.base) returnERROR; //空的顺序栈,所以栈顶指针=栈底指针 S.top=S.base; // 空的顺序栈,由MAXSIZE个空间可以存 S.stackSize=MAXSIZE; returnOK; } //入栈,将e压入顺序栈S中 Statuspush(SqStack&S,SElemTypee){ //判断栈是否满栈 if(S.top-S.base==S.stackSize) returnERROR; //将e存入S.top,存入栈顶,栈顶指针top++向上移动 *S.top++=e; returnOK; } //出栈,将栈顶元素给e Statuspop(SqStack&S,SElemType&e){ //判断栈内是否有元素,为空栈 if(S.top==S.base) returnERROR; //栈顶指针下移,将栈顶元素赋给e e=*(--S.top); return1; } //输出栈元素StatusprintStack(SqStackS){ SElemType*p=S.base; while(p!=S.top){ cout<<*p<<"\t"; p++; } cout<<endl; } intmain(){ SqStackS; inte,n,x,a,b,c,d; InitStack(S); cin>>n; if(n<=20000){ while(n-->0){ cin>>x; if(x){ cin>>e; push(S,e); }elseif(S.top==S.base){ cout<<"invalid"<<endl; }else{ pop(S,e); a=e; cout<<a<<endl; } } } return0; }
运行结果