设计一个栈(不允许使用STL中的任何类库),可以用顺序栈或者链栈。
实现如下操作:
输入
每个输入包含一个测试用例,第一个数N,表示后面有N个整数(仅包含正整数和-1),处理步骤如下:
(1)如果碰到正整数,则把该数入栈。
(2)如果碰到-1,则出栈一个元素。
测试数据中保证N<1000
输出
输出最终的栈顶元素。
如果出栈错误(例如:栈为空,却碰到-1),则输出:ERROR
如果中间没有出错,但最终栈为空,则输出:EMPTY
样例输入
6 1 2 -1 5 6 -1
样例输出
5
提示
输入如果是:4 -1 -1 2 3
则输出:ERROR
输入如果是:4 2 -1 3 -1
则输出:EMPTY
分析:首先理解顺序栈,我们可以吧顺序栈理解为一个数组,数组的下标用结构体里面的top记录。当我们取出栈里面的数据或者入栈时只是把数组原本的地址覆盖而已。并不是拿出数据后该处变成空白。在主函数中判断遇到的数据是否入栈还是出栈。
代码:
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXSIZE 1000//一定得是1000,根据题目要求,不然无法AC
using namespace std;
typedef struct {
int data[MAXSIZE];
int top;
}SqStack;
void InitStack(SqStack *&s)//初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack));
// s=new SqStack;
s->top=-1;
}
bool StackEmpty(SqStack *s)//栈空时
{
return (s->top==-1);
}
bool Push(SqStack* &s,int e)
{
if(s->top==MAXSIZE-1)
return false;
s->top++;
s->data[s->top]=e;//top做数组下标 ,记录数据
return true;
}
bool Pop(SqStack *&s)
{
int a;
if (s->top==-1)
return false;
a=s->data[s->top--];
return true;
}
int Gettop(SqStack *s)//取出栈顶的数据,同样看top。
{
int a;
if (s->top==-1)
return false;
a=s->data[s->top];
return a;
}
void DestroyStack(SqStack*&s)//销毁栈
{
free(s);
}
int main()
{
SqStack *s;
InitStack(s);
int N;
cin>>N;
for (int i = 0; i < N; i++) {//作循环判断是否该入栈还是出栈
int num;
cin >> num;
if (num > 0) {
Push(s,num);
}
else if (num == -1) {
if(StackEmpty(s)==true){
cout<<"ERROR";
return 0;
}
else
Pop(s);
}
}
if(StackEmpty(s)==true)
cout<<"EMPTY";
else
cout<<Gettop(s)<<endl;
DestroyStack(s);
return 0;
}