题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb苗苗今天刚刚学会使用括号,不过他分不清小括号,中括号,大括号和尖括号,不知道怎么使用这些括号,请帮助他判断括号使用是否正确。
输入输出格式
输入描述:
输入六行只包含’<’,’(’,’{’,’[’,’>’,’)’,’}’,’]'的字符串(长度不超过10000)
输出描述:
对应每行输入,如果输入的字符串中的括号正确匹配则输出yes,否则输出no。
输入输出样例
输入样例#:
(){}
输出样例#:
yes
思路
(栈)
这道题要求的是括号能不能匹配。参考网上的资料选择用栈来做,那我们可以用这种方案来求出括号能不能匹配:首先输入字符串
遍历一遍字符串
如果是左括号
压入栈
如果是右括号
首先判断是否合法
如果合法则将栈顶元素弹出栈
如果不合法就输出“no”结束程序
最后判断是否栈空
栈空,输出“yes”
栈非空,输出“no”
代码
#include<iostream>
#include<stack>
using namespace std;
int main(){
string a;
stack <char> s;
cin>>a;
for(int i=0;i<a.length();i++){
if(a[i]=='<'||a[i]=='('||a[i]=='{'||a[i]=='['){
s.push(a[i]) ;
}
else{
if(s.empty()){
cout<<"no"<<endl;
return 0;
}
if((a[i]=='>'&&s.top()=='<')||(a[i]==')'&&s.top()=='(')||(a[i]=='}'&&s.top()=='{')||(a[i]==']'&&s.top()=='[')){
s.pop();
}
else{
cout<<"no"<<endl;
return 0;
}
}
}
if(s.empty()){
cout<<"yes"<<endl;
}
else{
cout<<"no"<<endl;
}
return 0;
}
总结
使用标准库的栈和队列时,先包含相关的头文件
#include<stack>
#include<queue>
定义栈如下:
stack<int> stk;
定义队列如下:queue<int> q;
栈提供了如下的操作
s.empty() 如果栈为空返回true,否则返回false
s.size() 返回栈中元素的个数
s.pop() 删除栈顶元素但不返回其值
s.top() 返回栈顶的元素,但不删除该元素
s.push() 在栈顶压入新元素
队列提供了下面的操作
q.empty() 如果队列为空返回true,否则返回false
q.size() 返回队列中元素的个数
q.pop() 删除队列首元素但不返回其值
q.front() 返回队首元素的值,但不删除该元素
q.push() 在队尾压入新元素
q.back() 返回队列尾元素的值,但不删除该元素