ACM学习历程18——stack堆栈容器

Stack堆栈容器是一种实现了先进后出的线性表,它的插入和删除操作只能在栈顶实现。前面的博文中已经说过了,容器适配器包括:queuestackpriority_queue

这些适配器都是包装了vectorlistdeque中某个顺序容器的包装器,将一些基础容器转换成自己的容器。值得注意的是,适配器没有提供迭代器,不能同时插入和删除多个元素。使用stack前需要引入<stack>头文件。

(一)stack堆栈容器对象的创建:

stack<类型> 对象:stack<int>  s;

(二)stack常用的操作:

empty() 堆栈为空则返回真;

pop() 移除栈顶元素;

push() 在栈顶增加元素;

size() 返回栈中元素数目;

top() 返回栈顶元素。

#include<iostream>
#include<stack>
using namespace std;

int main()
{
	stack<int> s;
	s.push(1);
	s.push(2);
	s.push(3);
	cout<<"size="<<s.size()<<endl;
	while(!s.empty())
	{
		cout<<s.top()<<" ";
		s.pop();
	}
	cout<<endl;
	return 0;
}

(三)stack清空的方法:

while(s.empty()==false)
s.pop();
stack应用:

某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。现让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。在程序中输入车厢数目和出站的特定顺序,如果可以则输出Yes,否者输出No

样例输入:

5

1 2 3 4 5

5

5 4 1 2 3

6

6 5 4 3 2 1

样例输出:

Yes

No

Yes 

#include<iostream>
#include<fstream>
#include<deque>
#include<stack>

using namespace std;
int main()
{
	int n,s,i;
	deque<int> inque;
	deque<int> outque;
	stack<int> sta;
	deque<int>::iterator p;

	while(cin>>n)
	{
		inque.clear();
		for(i=0;i<n;i++)
		{
			cin>>s;
			//将出站的顺序写到inque中
			inque.push_back(s);
		}

		//原序队列输出
		outque.clear();
		for(i=1;i<=n;i++)
		{
             outque.push_back(i);
		}
        //清空栈
		while(!sta.empty())
		{
			sta.pop();
		}

		//flag标志,为1时可以正确出站,为0不可以
		int flag=1;

		while(!inque.empty())
		{
			if(sta.empty())
			{
				sta.push(outque.front());
				//outque.front();
			}
			else
			{
				if(sta.top()==inque.front())
				{
					sta.pop();
					inque.pop_front();
				}
				else if(sta.top()<inque.front())
				{
					sta.push(outque.front());
					outque.pop_front();
				}
				else
				{
					flag=0;
					break;
				}
			}
		}
		if(flag==1)
		{
			cout<<"Yes"<<endl;
		}
		else
		{
			cout<<"No"<<endl;
		}

	}
	return 0;
}
括号匹配问题:

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		string s;
		cin>>s;

		stack<char> S;
		S.push('#');

		for(int i = 0; i<s.size(); ++i)
		{
			if(s[i]-S.top()==1 || s[i]-S.top()==2)
			{
				S.pop();
			}
			else 
				S.push(s[i]);
		}

		if(S.size()==1) 
			cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值