*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾
题目要求概要:
输入:M 栈的最大容量, N 序列长度(从1~n), and K需要判断的序列个数. Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.
输出:对每个序列判断,print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.
记录一下我的心情啊!写完这道题我差点哭了出来(从7点写到9点其中各种报错和其他问题还去下了个zlib结果也没解决问题)
遇到的问题罗列:
1.忘记初始化栈导致一直出错直接不能运行
2.忘记清空栈导致整个对比错乱
3.不会调试……好吧三年了我一直用的是输出我想看到的中间过程作为调试方法,今天想学学结果程序报错说缺少zlib文件,我又去下载又说不匹配好了我还是继续看输出结果吧……
4.好不容易输出正确的样例提交了pat给了1分 想哭的新就有了 重新看一遍程序……觉得很有可能因为没有输出空格!!!这是最气的已经两次了,因为没输出换行符导致没有分数,每次还去全部检查!!!!
思路分析:
1.输入K[i]序列(大循环)
2.初始化flage,current(指向序列比对的位置),栈
3.将i(1~n)入栈,读栈顶和序列current比较,相同就出栈移动current,直到不同让下一个入栈。
4.让flage变成flase的条件:
-栈满,每次入栈都需要判断栈是否满,满的话break。
-所有数入栈完毕后栈非空。
我依旧用的严老师的结构保留了需要的功能,也可以用stack但是今天没带书明天试试看.
其实不算很难就是一定要考虑清楚各种条件……今天就到这里趴晚安吐血……
啊呀妈呀眼睛疼我这么美我会不会瞎~~~(/"≡ _ ≡)/~┴┴
#include <iostream>
using namespace std;
struct SqStack{
int *base;
int *top;
};
int M,N,K;
int arr[1010];
void InitStack(SqStack &S){
S.base=new int[1010];
S.top=S.base;
}
int GetTop(SqStack &S){
if(S.top==S.base)return false;
return *(S.top-1);
}
bool Push(SqStack &S,int e){
if(S.top-S.base==M)return false;
else{
*S.top=e;
S.top++;
return true;}
}
bool Pop(SqStack &S){
if(S.top==S.base)
return false;
*S.top--;
}
int main(){
cin>>M;
cin>>N;
cin>>K;
SqStack S;
InitStack(S);
while(K--){
while(S.base!=S.top){
Pop(S);
}
bool flag=true;
int current=0;
for(int i=0;i<N;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<N;i++){
bool over=Push(S,i+1);
if(over==false)
{flag=false;
break;}
while(GetTop(S)==arr[current]){
Pop(S);
current++;
}
}
if(S.base!=S.top)flag=false;
if(flag==true)cout<<"YES"<<endl;
if(flag==false)cout<<"NO"<<endl;
}
return 0;
}