【剑指offer】栈的压入和弹出序列
栈的压入、弹出序列
https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&tqId=11174&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //两种写法模拟整个过程 //1.直接利用栈模拟 stack<int> s; //从pop序列分析 for(int i = 0, j = 0; i < popV.size(); i++){ //对每一个弹出的元素,都把它之前的元素入栈的过程模拟一遍 while(s.empty() || s.top() != popV[i]){ //当栈里为空或者栈顶不是弹出的那个元素的时候 模拟压栈 s.push(pushV[j++]); if(j > pushV.size()) return false;//入栈的地址非法判断 } //当while循环结束,此时栈顶的元素和弹出序列的元素相同,模拟弹出 s.pop(); } //当弹出序列遍历完了之后,此时模拟的过程也应该结束,栈里不能有多余的元素 return s.empty()? true : false; /*2.利用vector数组模拟栈 vector<int> stack; //从push序列分析 for(int i = 0, j = 0; i < pushV.size(); i++){ //模拟按入栈顺序开始入栈,和弹出顺序作比较 stack.push_back(pushV[i]); //入栈每一个元素之后,判断此时的出栈序列元素是否和它一致,一致则弹出,否则继续模拟入栈 while(j < popV.size() && popV[j] == stack.back()){ //入栈的过程中和弹出序列相同时开始模拟按照弹出序列弹出 stack.pop_back(); j++; } } //当入栈元素全部入栈结束之后,必须也都弹出了,数组中不能存有元素 return stack.empty(); */ } };