队列与栈的爱情故事

队列与栈的爱情故事

一.故事背景
队列和栈同学是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;
}

结局
嗯,童话结局,自己脑补。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章