剑指offer67题-No21.栈的压入弹出序列

法1:辅助栈

同时用两个指针i, j分别指向两个序列的头部,

  • 每次我们先将i所指向的元素压入栈中, 然后i向后移动一步, 之后再检查当前栈顶, 若对应上了弹出序列中j所指向的元素, 则弹出元素,
  • j向后移动, 再继续检查, 直到栈空或栈顶元素和j所指元素不等为止
class Solution {
public:
    stack<int> s1;
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // write code here
        int len = pushV.size();
        int i = 0;
        int j = 0;
        while(i < len){
            s1.push(pushV.at(i));
            while(!s1.empty() && s1.top() == popV[j]){
                ++j;
                s1.pop();
            }
            ++i;
        }
        return j == len;
    }
};

法2:直接在数组上操作

  • pushV[i] != popV[0]元素,表示还没匹配到待弹出元素;继续i = i + 1压入元素;
  • push[i] == popV[0]时,即匹配上弹出元素,并i = i – 1让它始终指向pushV的顶部元素;同时popV也要更新到下一个元素j = j + 1,使其成为新的popV[0]。最后直到pushV 和popV都为空即匹配结束。
class Solution {
public:
    stack<int> s1;
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // write code here
        int i = 0;
        int j = 0;
        for(auto p : pushV){
            pushV[i] = p; // 这一步是模拟入栈操作
            while(i>=0 && pushV[i] == popV[j]){
                j++;
                i--;
            }
            i++;
        }
        return i == 0; // 检查最后的栈是否为空
    }
};
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇