栈
栈和队列相似但是不同,不同的是队列先进先出从末尾进排头出,栈像一个瓶子容器,从瓶口进,瓶口出,先进的在瓶底所以后出,所以栈的特点 先进后出,后进先出。然后下面讲用法和例题。
#include<stack>
stack<char(可以是int等)> q(名字);
q.push(a); //将a入栈
q.pop(); //将栈顶出栈
q.top(); //栈顶的值
q.empty(); //判断是否为空
例题:假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入输出格式
输入格式:
一行:表达式
输出格式:
一行:“YES” 或“NO”
输入输出样例
输入样例#1:
2*(x+y)/(1-x)@
输出样例#1:
YES
输入样例#2:
(25+x)(a(a+b+b)@
输出样例#2:
NO
题解:将所有左括号挨着入栈,然后每次出现右括号就去判断栈里面是否有左括号,如果有就继续,没有说明不合理就NO
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<queue>
#include<algorithm>
#include<iostream>
#define exp 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
using namespace std;
typedef unsigned long long LL;
stack<char> zhan;
int main()
{
char input;
while(scanf("%c",&input)&&input!='@')
{
if(input=='(')
zhan.push(input);//入栈
if(input==')') {
if(zhan.empty()) //判断栈是否为空即可
{
printf("NO\n");//也许大家会问,为啥不来个if(zhan.top()=='(' )呢,因为 这题只有小括号 而且会超时
return 0;//至于为啥要判断栈是否为空,大家想想,因为假如有个),结果前面没有对应(了,那就不行,此时就是栈空
}
zhan.pop();//出栈
}
}
if(zhan.empty())
printf("YES\n");//判断有没有多余的(
else
printf("NO\n");//也就是判断栈是否为空
return 0;
}
队列
队列就是一行人排在一起,先进去的人排在第一个,后进去的人排在后面,所以队列的特点先进先出,这个是很重要的。在处理一些特殊问题的时候,队列是非常有用的。下面主要讲用法和例题。
#include<queue> //要包含头文件
int a,b,c;
queue<int> q1; //定义q1 队列 <>中的为数据类型
q1.push(3);