栈的特点是先进后出,举一个简单的例子来理解一下,就像是洗盘子,将盘子一个一个放进水池中,第一个放进去的最后才能拿出来。就是这样一个道理。当然也可以放一个洗一个,然后拿出来。这个道理跟栈是一样的。
下面简单介绍一下栈的一些函数以及操作:
#include<stack> 文件头
stack<tpye>name;——>举个例子:stack<int>s; int 是类型,s是变量。
s.empty();判空函数,如果返回1,表示栈中为空。
s.push();将元素压入栈。
s.pop();删除栈顶元素,无返回值。若栈中无元素,调用后会报错,需要判空。
s.top();输出栈顶元素。
s.size();返回栈中元素个数。
我们来看一下题:
Description
假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ ”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。
Input
5+{[2X5]+2}
Output
YES
Sample Input
8-[{2+7]}
Sample Output
NO
下面是代码:
这个题的思路是首先将左括号从数组右侧循环放入第一个栈中,然后将右括号从数组右侧循环放入第二个栈中,然后将两个栈中的元素进行比对,如果符合,继续比对直至最后一组结束。若有一组不符合,直接跳出。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <queue>
#define max 10010
using namespace std;
struct L
{
int rp;
string name;
friend bool operator<(L a,L b)
{
if(a.rp==b.rp&&a.name<b.name)
return 1;
else if(a.rp>b.rp)
return 1;
return 0;
}
};
priority_queue<L>q[max];
int main()
{
int i,u,v,t,n,m;
L d;
string od;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
{
while(!q[i].empty()) q[i].pop();
scanf("%d",&t);
while(t--)
{
cin>>d.name>>d.rp;
q[i].push(d);
}
}
while(m--)
{
cin>>od;
if(od=="GETON")
{
cin>>u>>d.name>>d.rp;
q[u].push(d);
}
else if(od=="JOIN")
{
scanf("%d %d",&u,&v);
while(!q[v].empty())
{
q[u].push(q[v].top());
q[v].pop();
}
}
else
{
scanf("%d",&u);
cout<<q[u].top().name<<endl;
q[u].pop();
}
}
}
return 0;
}