隊列與棧的愛情故事

隊列與棧的愛情故事

一.故事背景
隊列和棧同學是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;
}

結局
嗯,童話結局,自己腦補。

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