堆栈的基本操作 C++
依次读入序列元素1,2,…,n进栈,每进一个元素,机器可要求下一个元素进栈或弹栈,如此进行。给定一个输入序列,判断栈空时弹出的元素构成的序列是否可能等于给定的序列,如果是则输出栈的操作过程,否则输出“NO”。
输入输入分两行第一行为n的值(即序列元素个数)第二行为给定的输入序列(序列元素均为整型)输出如果输入序列能够由题目规定的操作得到,则输出对栈的操作过程否则直接输出“NO”
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
bool function(std::queue<int>& order)//判断合法性
{
std::stack<int> S;
int n = order.size();
std::queue<int> order2;
order2 = order;
for (int i = 0;i < n;i++)
{
if (order2.front() > n || order2.front() < 1)
{
return false;
break;
}
order2.pop();
}
for (int i = 1; i <= n; i++)
{
S.push(i);
while (!S.empty() && order.front() == S.top()) {
S.pop();
order.pop();
}
}
if (!S.empty())
{
return false;
}
return true;
}
void prit(std::queue<int>& order)//依据判断合法性条件输出如何操作
{
std::stack<int> S;
int n = order.size();
int ii = 0;
for (int i = 1; i <= n; i++)
{
S.push(i);
cout << "PUSH " << i << endl;
while (!S.empty() && order.front() == S.top())
{
if (ii==n-1)
cout << "POP " << S.top();
else
cout << "POP " << S.top() << endl;
S.pop();
ii = ii + 1;
order.pop();
}
}
}
int main()
{
int n; int train;
cin >> n;
std::queue<int> order;
std::queue<int> order1; //创一副本,原本在判断合法性中会被破坏
for (int i = 0; i < n; i++) {
cin >> train;
order.push(train);
order1.push(train); }
if (function(order))
{
prit(order1); }
else {
cout<<"NO";
}
return 0;
}