栈的出入顺序问题
题目
给出一个栈的输入顺序为: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