假设以1 和0 分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由1 和0 组成的序列,这里把可以正常操作的序列称为合法序列,否则称为非法序列。请编写算法,判定所给的操作序列是否合法。若合法,返回1,否则返回0。输入序列的长度不超过30个操作
【输入形式】
第一个数字为操作序列的总数,后面的为操作序列的具体内容,每两个操作之间以空格键隔开。
【输出形式】
如果操作序列为合法序列,输出1,如果操作序列为非法序列,输出0;
tips:如果出现
1.出栈时 栈为空
2.操作结束后 栈为空
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef struct stack //栈的定义
{
int *top;
int *base;
int stacksize;
}SqStack;
void InitStack(SqStack &s) { //栈的初始化
s.base = s.top = new int[100]; //创建空间
if (!s.base) //创建失败 s.base为空
exit(-1);
s.stacksize = 100; //创建容量空间
}
int Empty(SqStack &s) //判断栈为空
{
if (s.top == s.base)
return 0;
else
return 1;
}
void push(SqStack &s, int e)//进栈
{
if (s.top - s.base == s.stacksize)//栈满
exit(-1);
*s.top = e;
s.top++;
}
int Pop(SqStack &s)
{
if (s.top == s.base)
return 0; //弹出栈时,如果遇到栈为空,即为非法操作
else{
s.top--; //栈非空,弹出,为合法操作
return 1;
}
}
int main()
{
SqStack s;
InitStack(s);
int n, num, flag;
cin >>num;
for (int i = 0; i < num; i++)
{
cin >> n;
switch (n) {
case 1: //执行进栈操作
push(s, n);
break;
case 0: //执行出栈操作
flag=Pop(s);
break;
}
}
if (Empty(s) == 1) //操作结束后判断是否为空,若非空,即为非法操作
flag = 0;
cout << flag;
return 0;
}