题目:
这题很轻易就能想到使用辅助栈。只不过我自己写的代码太麻烦了,原因是有一个地方没有转过弯来。
我原本设想的是,不断找到需要弹栈的元素,然后进行一一匹配。如果出现了无法匹配的情况,就返回False。匹配完成的话,并且两个数组的指针都指向了数组尾部,那么说明匹配成功。但是这样太绕了,因为我忽略了一个很显然的事实:
pushed数组如果能和popped匹配,则所有元素都需要进入辅助栈一次(包含了刚入栈就弹出的情况)
那么这题就显得十分清晰了。当每一个元素入栈时,判定是否和poped数组待匹配的元素相等。如果相等,则一直弹栈,去和poped数组的后续元素匹配即可。
如果最后辅助栈里面还有剩下的元素,则说明没能完全匹配。
在代码上简洁度的差别是很显而易见的:
C++代码附带测试:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
//自己写的实在是太复杂了,虽然也能过
//class Solution {
//public:
// bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
// stack<int> sup;
// int sizepush = pushed.size();
// int sizepop = popped.size();
// if(sizepush==0){
// return true;
// }
// int i=0;
// int j=0;
//
// while(i<sizepush){
// if(sup.empty()){
// sup.push(pushed[i]);
// i++;
// }
// while(i<sizepush&&sup.top()!=popped[j]){
// sup.push(pushed[i]);
// i++;
// }
// if(sup.top()==popped[j]){
// cout<<sup.top()<<" "<<popped[j]<<endl;
// sup.pop();
// j++;
// }
// }
//
// while(j<sizepop){
// if(sup.top()==popped[j]){
// cout<<sup.top()<<" "<<popped[j]<<endl;
// sup.pop();
// j++;
// }else{
// return false;
// }
// }
//
// if(i==sizepush&&j==sizepop){
// return true;
// }else{
// return false;
// }
// }
//};
class Solution {//简洁版写法
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> sup;
int j = 0;
for(auto& elem:pushed){
sup.push(elem);
while(!sup.empty()&& sup.top()==popped[j]){
sup.pop();
j++;
}
}
return sup.empty();
}
};
int main(){
vector<int> pushed = {1,2,3,4,5};
vector<int> popped = {4,3,5,1,2};
Solution solution;
cout<<solution.validateStackSequences(pushed,popped)<<endl;
}