隊列與棧的愛情故事
一.故事背景
隊列和棧同學是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;
}
結局
嗯,童話結局,自己腦補。