一般这种题都是出现在选择题里面的,而且元素较少,所以即使我们使用野路子(依次把选项代入测试)也不会花费多少时间。但是,我们总不能一直打游击啊,当遇到敌人主力的时候无能为力,那就坑了。
所以这里介绍怎样转游击战为阵地战,从正面硬刚敌人并且取胜的方法。
首先,假设入栈顺序是1,2,3,4
正确的出栈顺序(其中一种)2,3,4,1
错误的出栈顺序(其中一种)3,1,4,2
然后,开始准备进攻。我们设置一个中间栈:tempStack,记录一个出栈顺序下标index
1、按入栈顺序,存入一个元素到tempStack中
2、比较tempStack的栈顶元素与出栈顺序的第index个元素比较
相同,则进行3,否则进行1
3、弹出tempStack的栈顶元素,index++。执行2。
最后,如果循环结束后,tempStack为空,则表示出栈顺序正确。否则,出栈顺序错误。
估计乍看一眼,可能难以理解。其实,这就是模拟了一遍出入栈的过程。觉得难以理解的话,可以在纸上按上述流程把所有元素的入栈出栈画一遍就应该能理解了。我把代码贴在下面了,但是由于我用vector比较熟,所以在代码中也直接使用vector代替stack了。
#include <iostream>
using namespace std;
#include <vector>
#include <stack>
bool Judge(vector<int>& arrIn, vector<int>& arrOut)
{
vector<int> tempStack;
int i = 0;
for(vector<int>::iterator it = arrIn.begin();it != arrIn.end(); ++it)
{
tempStack.push_back(*it);
while(tempStack.size() > 0 && tempStack.back() == arrOut[i])
{
tempStack.pop_back();
++i;
}
}
return tempStack.empty();
}
int main()
{
vector<int> arrIn{
1,2,3,4};
vector<int> arrOut = {
3,1,4,2};
cout << boolalpha << Judge(arrIn,arrOut) << endl;
}
哦,千万记住,我用的是C++11标准。所以要使用支持c++11标准的编译器编译上述代码哦。
ps: minGw编译选项使用-std=c++11居然不能编译成功,反而要使用-std=gnu++11,受不了!