北航计算机软件技术基础课程作业&笔记【3】

栈的出入顺序问题

题目

给出一个栈的输入顺序为:ABCDEFG,出栈顺序为CBDFGEA,画出其入栈、出栈的变化图

分析

这个意思就是给栈的输入顺序已知,但是并不是所有元素全部入栈之后才全部出栈,可以进C后立马出C再出B再入别的元素

一个动态演示:

操作 栈内元素
入A A
入B AB
入C ABC
出C AB
出B A

思路

这里采用模拟栈的思路,在待入栈的元素不为空时,一直读取栈顶元素,看是否等于该出栈的元素,不等于就继续入栈,以此循环。最后把栈里的全出来就结束了

简单使用c++的std模板中的deque和stack,来完成已知入栈和出栈顺序,判断入栈出栈操作流程:

cpp 复制代码
#include <iostream>
#include <stack>
#include <string>
#include <vector>
#include <deque>
int main()
{
    //创建被模拟操作的栈
    std::stack<char>  my_stack;
    
    //用deque来做已知量的存储,方便后续直接读取头元素
    std::deque<char> in_order = {'A','B','C','D','E','F','G'};
    std::deque<char> out_order = {'C','B','D','F','G','E','A'};
    
    //用于存储结果,验证是否与out-order一致
    std::string res;
    
    //先往栈放一个,以免空栈调.top报错
    my_stack.push(in_order.at(0));
    in_order.pop_front();
    // 非空就继续
    while(!in_order.empty())
    {
        // std::cout << "top"<< my_stack.top()  << std::endl;
        // std::cout << "in"<< in_order.at(0)  << std::endl;
        //判断出的头是不是当前栈内元素
        if(my_stack.top() != out_order.at(0))
        {
            char in = in_order.at(0);
            my_stack.push(in_order.at(0));
            std::cout << "in:"<< in << std::endl;
            in_order.pop_front();
        }
        else
        {
            //不是则继续入栈
            char top = my_stack.top();
            my_stack.pop();
            out_order.pop_front();
            std::cout << "out:"<< top << std::endl;
            res+=top;
            //直到最后一个元素入栈,可以不要
            if(top == 'G')
                break;
        }
        
    }
    //把最后栈里的元素顺序弹出即可
    while(!my_stack.empty())
    {
        char top = my_stack.top();
        my_stack.pop();
        std::cout << "out:"<< top << std::endl;
        res+=top;
    }
    std::cout << res << std::endl;
    return 0;
}

最终输出结果:

复制代码
in:B
in:C
out:C
out:B
in:D
out:D
in:E
in:F
out:F
in:G
out:G
out:E
out:A
CBDFGEA
相关推荐
汉克老师3 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
Mr_Xuhhh4 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
c++bug5 小时前
六级第一关——下楼梯
算法
PAK向日葵5 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
Morri35 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode
林木辛5 小时前
LeetCode热题 15.三数之和(双指针)
算法·leetcode·双指针
AndrewHZ5 小时前
【3D算法技术】blender中,在曲面上如何进行贴图?
算法·3d·blender·贴图·三维建模·三维重建·pcg
Jared_devin5 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
搞全栈小苏6 小时前
基于Qt QML和C++的MQTT测试客户端(CMakeLists实现)
xml·c++·qt
啊?啊?6 小时前
18 从对象内存到函数调用:C++ 虚函数表原理(继承覆盖 / 动态绑定)+ 多态实战
开发语言·c++·多态原理