本次博客中,分享一下关于栈和队列中经典题目——如何判断出栈入栈合法性的流程,思路以及代码实现。
流程图:
思路:
首先需要判断出栈序列popV和入栈序列pushV的大小是否相同。并用push_index和pop_index来表示出栈和入栈序列的下标,借此来表示此时的入栈和出栈元素。
1》不相同,即证明出栈入栈不合法,返回false.
2》相同,继续下面的循环体
判断出栈入栈的循环体。
(1)判断栈是否为空。
(1.1)如果栈不为空,判断指向的出栈元素和栈顶元素是否一致。
(1.1.1)如果一致,pop栈顶元素,指向出栈元素的下一个,即pop_index++。然后继续(1)。
(1.1.2)如果不一致,继续(1.2)。
(1.2)如果栈为空或者满足(1.1.2),用出栈序列popV中去找,是否存在入栈队列中与出栈队列相同元素的元素。
(1.2.1)如果在入栈序列中找到,出栈序列和入栈序列都指向下一个元素,即pop_index++,push_index++。
(1.2.2)如果没有在入栈序列中找到,判断push_index >= pushV是否成立。
(1.2.2.1)结论不成立,即push_index < pushV,把这个元素入栈,然后入栈序列指向下一个元素,即push_index++,继续循环体(1)。
(1.2.2.2)结论成立,即push_index >= pushV,遍历所有入栈元素未找到与出栈元素相同的元素,即证明出栈入栈不合法,返回false.
结束循环条件:
只有当出栈元素pop_index== popV.size().才会结束循环并返回true.
代码如下:
分享如上,望共同进步!good luck to you!
流程图:
首先需要判断出栈序列popV和入栈序列pushV的大小是否相同。并用push_index和pop_index来表示出栈和入栈序列的下标,借此来表示此时的入栈和出栈元素。
1》不相同,即证明出栈入栈不合法,返回false.
2》相同,继续下面的循环体
判断出栈入栈的循环体。
(1)判断栈是否为空。
(1.1)如果栈不为空,判断指向的出栈元素和栈顶元素是否一致。
(1.1.1)如果一致,pop栈顶元素,指向出栈元素的下一个,即pop_index++。然后继续(1)。
(1.1.2)如果不一致,继续(1.2)。
(1.2)如果栈为空或者满足(1.1.2),用出栈序列popV中去找,是否存在入栈队列中与出栈队列相同元素的元素。
(1.2.1)如果在入栈序列中找到,出栈序列和入栈序列都指向下一个元素,即pop_index++,push_index++。
(1.2.2)如果没有在入栈序列中找到,判断push_index >= pushV是否成立。
(1.2.2.1)结论不成立,即push_index < pushV,把这个元素入栈,然后入栈序列指向下一个元素,即push_index++,继续循环体(1)。
(1.2.2.2)结论成立,即push_index >= pushV,遍历所有入栈元素未找到与出栈元素相同的元素,即证明出栈入栈不合法,返回false.
结束循环条件:
只有当出栈元素pop_index== popV.size().才会结束循环并返回true.
代码如下:
#include<iostream>
using namespace std;
#include<vector>
#include<stack>
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size() != popV.size()) return false;
int push_index = 0;
int pop_index = 0;
stack<int> s;
while(pop_index < popV.size()){
if(!s.empty() && s.top() == popV[pop_index]){
pop_index ++;
s.pop();
continue;
}
if(push_index < popV.size() && pushV[push_index] == popV[pop_index]){
pop_index ++;
push_index ++;
}
else if(push_index >= popV.size())
{
return false;
}
else{
s.push(pushV[push_index]);
push_index ++;
}
}
return true;
}
int main()
{
int a[] = {1,2,3,4,5};
int b[] = {4,5,1,2,3};//0
//int b[] = {4,5,3,2,1};//1
vector<int> push;
vector<int> pop;
for(int i=0; i<5; i++){
push.push_back(a[i]);
pop.push_back(b[i]);
}
cout<<IsPopOrder(push, pop)<<endl;
system("pause");
return 0;
}
分享如上,望共同进步!good luck to you!