剑指offer31. 栈的压入弹出序列P168

mac2025-07-21  3

剑指offer31. 栈的压入弹出序列 P168

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。

用辅助栈 s,nums是给定的弹出序列,inputs是压栈序列

如果栈不空,而且而且下一个弹出数字num恰好时栈顶数字,直接弹出如果num和栈顶元素不等,把压栈序列inputs中num及num之前的数字压栈,如果在inputs这一轮的压栈中没有找到num,匹配失败。最后两个序列都走到末尾,而且辅助栈空,匹配成功

换句话说:在弹出串中找到栈顶值之前,把没有访问过的输入串元素入栈,更新没有访问的元素头索引vis ,如果到最后都没有找到当前栈顶值,匹配失败

// 寻找并压栈 bool findAndPush(stack<int> &s, const int *input, const int *pattern, int &vis, int len, int index) { for (int i = vis + 1; i < len; ++i) { s.push(input[i]); if (input[i] == pattern[index]) { vis = i; return true; } } return false; } bool isPopOrder(const int *input, const int *pattern, int len) { if (input == NULL || pattern == NULL || len < 1) return false; int vis = -1; // 不能从0开始,因为find函数里从vis+1开始压栈 stack<int> s; findAndPush(s,input, pattern, vis, len, 0);//初始 for (int i = 0; i < len;){ int temp = pattern[i]; if (!s.empty() && s.top() == temp) { // 栈顶和当前值相等,比较下一个元素 s.pop(); ++i; }else if ( !findAndPush(s, input, pattern, vis, len, i) ) { return false; // 找不到匹配失败 } } return true; }
最新回复(0)