栈的出入顺序问题
题目
给出一个栈的输入顺序为:ABCDEFG,出栈顺序为CBDFGEA,画出其入栈、出栈的变化图
分析
这个意思就是给栈的输入顺序已知,但是并不是所有元素全部入栈之后才全部出栈,可以进C后立马出C再出B再入别的元素
一个动态演示:
操作 | 栈内元素 |
---|---|
入A | A |
入B | AB |
入C | ABC |
出C | AB |
出B | A |
思路
这里采用模拟栈的思路,在待入栈的元素不为空时,一直读取栈顶元素,看是否等于该出栈的元素,不等于就继续入栈,以此循环。最后把栈里的全出来就结束了
简单使用c++的std模板中的deque和stack,来完成已知入栈和出栈顺序,判断入栈出栈操作流程:
#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