2021-03-24

堆栈的基本操作 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;
			 }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值