队列与栈的爱情故事
一.故事背景
队列和栈同学是STL科技大学ACM的队友,队列同学喜欢栈同学已经很久了,其实栈同学对队列也是有好感的。但是,女神嘛,怎么能那么轻松就答应,所以栈同学告诉队列只要赢得比赛,便同意做他女朋友。
二.参加比赛
队列同学遇到的问题:
括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据 都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
队列同学苦苦思考后想出了解题思路:
首先读入字符串,从头遍历,遇见左括号就放进另外一个str字符数组中。
当遇到右括号时,判断str中的最后一个元素与当前括号是否配对。
若配对,继续判断下一个括号,同时str的下标往前移一个,指向前一个元素。 最后判断是否有剩余左括号。
这不是刚好可以利用栈同学 的 pop() 函数删除最后插入元素的特点,从而实现,与右括号匹配的刚好是最近的左括号。
队列同学的代码:
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
int main(){
int N,i;
char str[100];
stack<char>s;
scanf("%d",&N);
getchar();
while(N --){
memset(str,0,100);
gets(str);
int len = strlen(str);
if(len % 2){
printf("No\n");
}else{
for(i = 0;i < len;i ++){
if(str[i] == '(' || str[i] == '['){
s.push(str[i]);
}else if((str[i] == ')' && s.top() == '(' )|| (str[i] == ']' && s.top() == '[' )){
s.pop();
}else s.push(str[i]);
}
if(s.empty()){
printf("Yes\n");
}else printf("No\n");
while(s.empty() != 1)
s.pop();
}
}
}
完赛
就这样,队列同学赢得了比赛,与栈同学谈起了恋爱,栈同学:我觉得我们应该互相了解下对方,这样才能拥有长久的幸福!
个人介绍
队列:
(在这儿只介绍最基本操作)
C++队列Queue类成员函数如下:
头文件:queue
函数 | 作用 |
---|---|
back() | 返回最后一个元素 |
empty() | 如果队列空则返回真 |
front() | 返回第一个元素 |
pop() | 删除第一个元素 |
push() | 在末尾加入一个元素 |
size() | 返回队列中元素的个数 |
#include<iostream>
#include<queue>//队列的头文件
using namespace std;
int main(){
queue<int>s;//定义一个队列 : queue<数据类型>队列名称;
s.push(1);
s.push(2);
s.push(3);
cout << s.empty() << endl; // 判断队列是否为空,空返回 1,非空返回 0 : s.empty();
cout << s.size() << endl; // 计算队列中的元素个数 : s.size();
cout << s.front() << endl;// 引用队列头的一个元素,并且可以对其进行运算: s.front();
cout << s.back() << endl;// 引用队列尾的一个元素,并且可以对其进行运算: s.back();
s.front() += 2;
cout << s.front() << endl;
s.pop(); // 删除容器的第一个元素 : s.pop();
cout << s.front() << endl;
}
栈:
函数 | 作用 |
---|---|
size( ) | 返回栈中元素个数 |
top( ) | 返回栈顶的元素 |
pop( ) | 从栈中取出并删除元素 |
push() | 向栈中添加元素e |
empty( ) | 栈为空时返回true |
#include<iostream>
#include<stack> //栈的头文件
using namespace std;
int main(){
stack<int>s; //定义一个栈 : stack<数据类型>栈名称;
s.push(1); //从容器顶部插入一个元素,从s内部调用函数 :s.push(插入元素);
cout << s.empty() << endl; // 判断栈是否为空,空返回 1,非空返回 0 : s.empty();
cout << s.size() << endl; // 计算栈中的元素个数 : s.size();
cout << s.top() << endl; // 引用容器口的一个元素,并且可以对其进行运算: s.top();
s.top() += 3;
cout << s.top() << endl;
s.pop(); // 删除容器口的元素 : s.pop();
cout << s.empty() << endl;
}
结局
嗯,童话结局,自己脑补。