如题,其实是两年前写的C++代码,但是我忘记了当时的代码思路,现在整理了一下,痛苦(╬ ̄皿 ̄)=○
【建议放缩浏览器的页面比例,看代码方便,复习自用】
#include <iostream> using namespace std; //可以确定了,当前代码是, //给定多组测试输入数据:每组的输入结构:栈总元素n 和 出栈顺序数组outseq[n] //输出:判断每组的出栈顺序是否正确,输入完所有测试组的数据,按每组出栈数据正确输出"Yes\n",错误输出"No\n",最后一组结果输出完无"\n"; int main(){ int b[]={0};//存储判断每一条测试数据中是否栈内有元素"无:1","有:2"的数组 for(int i=0;;i++){ //循环 int n; b[i]={0};//重置储存当前测试数据判断有无元素的数组元素b[i]=0; cin>>n;//输入数值到 n(栈内总个数) if(n==0){ //判断 0,则检查栈内是否有元素 int j=0; while(b[j]){ //开始循环b[]数组元素 if(b[j]==1){ //判断最后一位元素值的是否为 1 if(b[j+1]) cout<<"Yes"<<endl; else cout<<"Yes"; } if(b[j]==2){ //判断最后一位元素值的是否为 2 if(b[j+1]) cout<<"No"<<endl; else cout<<"No"; } j++; } break; //结束for的大循环 } int outseq[n];//出栈顺序数组 for(int j=0;j<n;j++)cin>>outseq[j]; //循环输入数值到outseq数组内,//保存当次的测试数据, int Stack[n];//入栈数组,默认入栈顺序:1=>2=>3=>4...与 int top=-1, //栈顶默认-1起始点(0位置==第一的元素位置) outindex=0, //记录出栈序列 innum=1; //记录入栈序列 while(outindex<n){//栈出记录数小于栈内总个数 if(top>=0 && Stack[top]==outseq[outindex]){ //匹配出栈元素 //(条件: //1、栈内有元素 (栈顶位置>=0) //且 2、栈顶位置的元素值等于outseq[出栈记录数位置数(判断成功时出栈数才能自加一,就定死了outseq[outindex]侧条件 ]的值) //等价于循环判断Stack入栈数组的栈顶元素与outseq出栈表是否匹配,不匹配继续入栈,直到匹配则出栈,继续循环判断,直至outindex指完outseq数组或入栈爆仓) top--; //栈顶减一 outindex++; //出栈记录数加一 }else{ if(innum>n)break; //无元素入栈,跳出while循环 (入栈爆仓,中断循环) top++; //栈顶位置加一 Stack[top]=innum; //栈数组填充入栈记录数,即按默认入栈顺序:1=>2=>3=>4...入栈 innum++; //入栈记录数加一 } } if(outindex>=n){ //判断出栈记录数是否大于等于栈的总个数,即判断栈内元素是否出栈完毕 b[i]=1;//栈内无元素 }else{ b[i]=2;//栈内有元素 } } }
好了,整理出来了,代码核心思路是:模拟入栈操作,边入栈,边匹配给定的出栈表元素,不正确继续入栈,直到匹配成功,后继续判断下一个栈顶是否匹配出账表,循环往复,直到入栈爆仓无法继续入栈(入栈记录数大于栈内总数【默认入栈顺序:1=>2=>3=>4......】),保存本次测试出栈表数据是否正确的数据,接下组测试数据,直到无测试数据,按要求完成输出出栈表正确与否的判断数据。