顺序栈,整数入栈

设计一个栈(不允许使用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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值