C++的STL 栈实现 判断栈的出栈顺序是否合理

有这样的题目:
已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?

类似如下:
已知栈的出栈序列为:3 2 5 4 1,判断该栈的出栈序列是否合法
过程如下:
第一次1-5顺序入栈:1,2,3
第二次 3 出栈:1,2
第三次 2 出栈:2
第四次 4,5 入栈:1,4,5
第五次 5 出栈:1,4
第六次 4 出栈:1
第七次 1 出栈:

最终可以得到合法的出栈序列:3 2 5 4 1
而序列:3 1 2 4 5 则不合法

在这里插入图片描述

解决方法主要是使用栈和队列来模拟整个过程,是否满足

  1. 出栈序列存放在队列中:3,2,5,4,1,创建一个临时栈来存放入栈序列(1-5)
  2. 模拟入栈过程,同时判断入栈后的栈顶是否和队列的对头是否相等;相等则意味着此时该数值合理出栈;否则继续入栈
  3. 上过程结束后,若临时栈或者队列中仍然存在元素,则该出栈序列不合法

具体过程如下:
初始:
queue: 3 2 5 4 1
stack:
第一次:3 2 5 4 1
stack:1
第二次:
queue: 3 2 5 4 1
stack: 1,2
第三次:
queue: 2 5 4 1
stack: 1,2
第四次:
queue 2 5 4 1
stack: 1,2,4

最后一次:
queue: 1
stack :1

实现代码如下:

bool judge_formal_seq(queue<int> order){
    stack<int> seq;
    int num = order.size();

	if (order.empty()) {
		return false;
	}
	
    for (int i = 1; i <= 5; ++i) {
        seq.push(i);
		/*判读队头元素和栈顶元素是否相等,相等则认为该元素可以出栈,两者都pop*/
        while (!seq.empty() && order.front() == seq.top()) { 
            order.pop();
            seq.pop();
        }
    }
    
    if(seq.empty()) {
        return true;
    } else {
        return false;
    } 
}

测试代码如下:

#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

bool judge_formal_seq(queue<int> order){
    stack<int> seq;
    int num = order.size();

    if (order.empty()) {
        return false;
    }

    for (int i = 1; i <= 5; ++i) {
        seq.push(i);
        while (!seq.empty() && order.front() == seq.top()) {
            order.pop();
            seq.pop();
        }
    }
    if(seq.empty()) {
        return true;
    } else {
        return false;
    } 
}

int main() {
    queue<int> order;
    int tmp;
    cout << "construct the exit stack seq :" << endl;

    for (int i = 0; i < 5; ++i){
        cin >> tmp;
        order.push(tmp);
    }

    cout << "judge the stack seq is " << (judge_formal_seq(order)?"true":"false") << endl;
    return 0;
}

输出如下:

construct the exit stack seq :
3 2 5 4 1
judge the stack seq is true

construct the exit stack seq :
3 1 2 5 4 
judge the stack seq is false
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值