检测出栈的合法性问题
题目:给定一个入栈和一个出栈序列?请判断是否合法
eg:入栈12345,出栈35124
用一个辅助栈,如果栈为空,就push(入栈序列)
比较栈顶元素和出栈序列当前值是否相等,若相等,出栈此元素,并将下次访问出栈序列位置后移;否则,继续入入栈序列里的元素。
重复1,2步骤,直到入栈序列为空,且栈顶元素不等于出栈序列当前访问位置时即不合法。栈空,入栈序列空,出栈序列空为合法出栈。
此例中将3,5,取出后,明显1不是栈顶元素,所以不是合法的。
#include<iostream>#include<assert.h>#include<stack>usingnamespacestd;boolIsLegal(constchar*inOrder,constchar*outOrder){assert(inOrder&&outOrder);if(strlen(inOrder)!=strlen(outOrder))returnfalse;char*source=(char*)inOrder;char*dest=(char*)outOrder;stack<char>s;charch;while(!s.empty()||*source!='\0'){while(!s.empty()&&s.top()==*dest){dest++;s.pop();}if(*source=='\0')break;s.push(*source++);}if(*dest=='\0')returntrue;elsereturnfalse;}//法二classSolution{public:boolIsPopOrder(vector<int>pushV,vector<int>popV){if(pushV.size()==0)returnfalse;vector<int>stack;for(inti=0,j=0;i<pushV.size();){stack.push_back(pushV[i++]);while(j<popV.size()&&stack.back()==popV[j]){stack.pop_back();j++;}}returnstack.empty();}};voidTest1(){cout<<IsLegal("12345","35124")<<endl;cout<<IsLegal("12345","54321")<<endl;cout<<IsLegal("12345","35421")<<endl;cout<<IsLegal("12345","23451")<<endl;cout<<IsLegal("12345","12345")<<endl;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。