#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//bool validStackSequences(vector<int>& inVec, vector<int>& outVec)
//{
// //思路分析
// //元素个数不同时,入栈的数据必然不能输出出栈顺序为outVec的结果
// //对inVec从前到后依次进行入栈操作,入栈前要与outVec中的参照元素进行比较,最开始outVec的参照元素就是第一个元素
// //当要入栈元素正好等于outVec的参照元素时,该元素不进行入栈操作,
// //outVec中的参照元素往后移动,作为新的参照元素
// //用栈的栈顶元素与这个新元素进行比较,如果相等,则出栈且outVec中的参照元素往后移动,
// //indexOutVec更新新的参照元素
// //当要入栈元素不等于outVec的参照元素时,该元素进行入栈操作,outVec中的参照元素保持不动
//
// stack<int> stack;
// if (inVec.size() != outVec.size()) return false;
//
// int indexOutVec = 0;
// for (int i = 0; i < (int)inVec.size(); i++)
// {
// if (inVec[i] == outVec[indexOutVec])
// {
// //outVec中的参照元素往后移动
// indexOutVec++;
// //outVec[indexOutVec],作为新的参照元素,同时,用栈的栈顶元素与这个新元素进行比较,如果相等,则出栈且outVec中的参照元素往后移动,
// while (!stack.empty() && (stack.top() == outVec[indexOutVec]))
// {
// stack.pop();
// //indexOutVec更新新的参照元素
// indexOutVec++;
// }
// }
// else
// {
// //当要入栈元素不等于outVec的参照元素时,该元素进行入栈操作,outVec中的参照元素保持不动
// stack.push(inVec[i]);
// }
// }
//
// //栈为空则表示入栈为inVec的顺序可以输出出栈为outVec的顺序的结果
// return stack.empty();
//}
//优化
//上面的逻辑省略了一次入栈操作,但是思考一下可以发现
//省略这个操作意义不大,因为即使你不进行入栈
//仍然要用stack的栈顶元素与outvec的参照元素进行比较,判断两者是否移动更新.
//思考一下如果你在相等的情况下也入栈了
//同样用stack的栈顶元素与outvec的参照元素进行比较,然后判断两者是否移动更新.
//逻辑也是正确的
//所以上面那个相等则不入栈的操作反而多搞了一次if判断
bool validStackSequences(vector<int>& inVec, vector<int>& outVec)
{
//思路分析
//元素个数不同时,入栈的数据必然不能输出出栈顺序为outVec的结果
//对inVec从前到后依次进行入栈操作,入栈前要与outVec中的参照元素进行比较,最开始outVec的参照元素就是第一个元素
//当要入栈元素正好等于outVec的参照元素时,该元素不进行入栈操作,
//outVec中的参照元素往后移动,作为新的参照元素
//用栈的栈顶元素与这个新元素进行比较,如果相等,则出栈且outVec中的参照元素往后移动,
//indexOutVec更新新的参照元素
//当要入栈元素不等于outVec的参照元素时,该元素进行入栈操作,outVec中的参照元素保持不动
stack<int> stack;
if (inVec.size() != outVec.size()) return false;
int indexOutVec = 0;
for (int i = 0; i < (int)inVec.size(); i++)
{
stack.push(inVec[i]);
if (inVec[i] == outVec[indexOutVec])
{
while (!stack.empty() && (stack.top() == outVec[indexOutVec]))
{
stack.pop();
indexOutVec++;
}
}
}
return stack.empty();
}
int main()
{
vector<int> in1 = { 1,2,3,4,5 };
vector<int> out1 = { 4,5,3,2,1 };
cout << "in1 和 out1 是否正确的入栈和出栈序列" << validStackSequences(in1, out1) << endl;
vector<int> in2 = { 1,2,3,4,5 };
vector<int> out2 = { 4,3,5,1,2 };
cout << "in2 和 out2 是否正确的入栈和出栈序列" << validStackSequences(in2, out2) << endl;
int ss;
}
验证栈序列
于 2022-03-14 23:52:38 首次发布