题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
分析:建立一个辅助栈,将第一个序列数字依次压入栈中,并按照第二个序列顺序依次出栈。
#include <iostream>
#include <stack>
using namespace std;
bool ispoporder(const char *push, const char *pop, int len)
{
bool flag = false;
if(push!=NULL && pop!=NULL && len>0)
{
stack<char> stack1;
const char *push_next = push;
const char *pop_next = pop;
while(pop_next - pop < len)
{
while(stack1.size()==0 || stack1.top()!=*pop_next)//如果栈为空或者栈顶元素和出栈字符不相等,则需要继续压栈
{
if(stack1.size()==len)//如果栈已经压满,则退出
break;
stack1.push(*push_next);
++push_next;
}
if(stack1.top()!=*pop_next)//如果栈压满,但栈顶元素还是不等于出栈字符,则说明出栈顺序不正确
break;
stack1.pop();//否则说明出栈顺序正确,将栈顶元素出栈
++pop_next;
}
if(stack1.size()==0 && pop_next-pop==len)//如果栈为空并且出栈字符串也执行到最后,则说明出栈顺序正确
flag = true;
}
return flag;
}
int main()
{
char *push = "12345";
char *pop1 = "45321";
char *pop2 = "43512";
bool flag;
cout<<"压入顺序:"<<push<<endl;
cout<<"弹出顺序1:"<<pop1<<endl;
cout<<"弹出顺序2:"<<pop2<<endl;
flag = ispoporder(push,pop1,5);
if(flag)
cout<<"弹出顺序1是正确的弹出顺序!"<<endl;
else
cout<<"弹出顺序1不是正确的弹出顺序!"<<endl;
flag = ispoporder(push,pop2,5);
if(flag)
cout<<"弹出顺序2是正确的弹出顺序!"<<endl;
else
cout<<"弹出顺序2不是正确的弹出顺序!"<<endl;
return 0;
}