判断栈的出栈顺序是否正确

一般这种题都是出现在选择题里面的,而且元素较少,所以即使我们使用野路子(依次把选项代入测试)也不会花费多少时间。但是,我们总不能一直打游击啊,当遇到敌人主力的时候无能为力,那就坑了。
所以这里介绍怎样转游击战为阵地战,从正面硬刚敌人并且取胜的方法。

首先,假设入栈顺序是1,2,3,4
正确的出栈顺序(其中一种)2,3,4,1
错误的出栈顺序(其中一种)3,1,4,2
然后,开始准备进攻。我们设置一个中间栈:tempStack,记录一个出栈顺序下标index
1、按入栈顺序,存入一个元素到tempStack中
2、比较tempStack的栈顶元素与出栈顺序的第index个元素比较
相同,则进行3,否则进行1
3、弹出tempStack的栈顶元素,index++。执行2。
最后,如果循环结束后,tempStack为空,则表示出栈顺序正确。否则,出栈顺序错误。
估计乍看一眼,可能难以理解。其实,这就是模拟了一遍出入栈的过程。觉得难以理解的话,可以在纸上按上述流程把所有元素的入栈出栈画一遍就应该能理解了。我把代码贴在下面了,但是由于我用vector比较熟,所以在代码中也直接使用vector代替stack了。

#include <iostream>
using namespace std;
#include <vector>
#include <stack>

bool Judge(vector<int>& arrIn, vector<int>& arrOut)
{
    vector<int> tempStack;
    int i = 0;
    for(vector<int>::iterator it = arrIn.begin();it != arrIn.end(); ++it)
    {
        tempStack.push_back(*it);
        while(tempStack.size() > 0 && tempStack.back() == arrOut[i])
        {
            tempStack.pop_back();
            ++i;
        }
    }
    return tempStack.empty();
}

int main()
{
    vector<int> arrIn{1,2,3,4};
    vector<int> arrOut = {3,1,4,2};
    cout << boolalpha << Judge(arrIn,arrOut) << endl;

}

哦,千万记住,我用的是C++11标准。所以要使用支持c++11标准的编译器编译上述代码哦。
ps: minGw编译选项使用-std=c++11居然不能编译成功,反而要使用-std=gnu++11,受不了!

### 如何判断出栈顺序是否正确 为了验证给定的出栈顺序是否合法,可以通过模拟入出栈的过程来实现。具体方法如下: 对于一组从 `1` 到 `n` 的整数序列作为入元素,以及一个指定长度为 `m` 的目标出栈序列,算法流程描述如下: - 初始化一个空用于存储临时入的数据。 - 使用两个指针变量分别指向当前处理位置:一个是待入序列的位置(初始设为 1),另一个是指向目标出栈序列起始处。 当遍历需要入的数组时,将数据压入辅助,并检查顶元素是否等于下一个期望出栈的数值;如果相等,则执行一次出栈操作并移动至下一位预期出栈值[^1]。重复上述过程直到所有可能的操作完成为止。 最终,若整个过程中均能成功匹配所有的出栈请求而无剩余未处理项留在中,则表明该出栈序列是有效的;反之,若有任一时刻无法满足条件或存在残留项目,则判定为非法序列[^5]。 下面是一个简单的 Python 实现例子,用来检测特定情况下的进出行为是否合规: ```python def is_valid_pop_sequence(push_order, pop_order): stack = [] push_index = 0 for value in pop_order: while not stack or stack[-1] != value: if push_index >= len(push_order): break stack.append(push_order[push_index]) push_index += 1 if not stack or stack[-1] != value: return "NO" stack.pop() return "YES" if not stack else "NO" print(is_valid_pop_sequence([1, 2, 3], [2, 1, 3])) # 应返回 YES print(is_valid_pop_sequence([1, 2, 3], [3, 1, 2])) # 应返回 NO ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值