1. 题目内容
1.1 问题描述
假设以1 和0 分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由1 和0 组成的序列,称可以操作的序列为合法序列,否则称为非法序列。写出一个算法,判定所给的操作序列是否合法。若合法,返回1,否则返回0。输入序列的长度不超过30个操作
1.2 输入形式
第一个数字为操作序列的总数 后面的为操作序列的具体内容,每两个操作之间以空格键隔开。
1.3 输出形式
如果操作序列为合法序列,输出1,如果操作序列为非法序列,输出0;
1.4 样例输入
4 1 1 1 1
1.5 样例输出
0
2. 大致思路
设定变量stackNum来记录当前栈中元素的个数
3. 实现代码
#include<stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int i = 0;
int stackNum = 0;
int flag = 0; // 记录输入中途stackNum有没有负数的情况
for(i = 0; i < n; i++)
{
int operation;
scanf("%d", &operation);
if(operation){
stackNum++;
}
else{
stackNum--;
}
if(stackNum < 0){
flag = 1;
break;
}
}
if(flag){
printf("0\n"); // 输入中途stackNum是负数即为不合法
}
else if(stackNum != 0){ // 输入结束stackNum不为0即为不合法
printf("0\n");
}
else{
printf("1\n"); // 前面两种情况都没有的话,就是合法序列
}
}
4. 学习后言
还是挺简单哒。