一.栈(stack)
1.栈属于一种线性表,其特点是“先进后出”。
2.头文件
#include<stack>
3.定义方法
stack(int) k;//k是栈的名字
4.基本函数及用法
k.push(x); //将x插入栈k中
k.pop(); //将栈顶元素弹出,无返回
k.top(); //返回栈顶元素
k.empty(); //判断栈是否为空,空返回1
k.size(); //查询栈中元素个数
5.栈的用法举例
题目:括号匹配
题目描述
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配
本题的任务是检验一个给定的表达式中的括号是否匹配正确
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”
输入描述
一行字符,只含有圆括号和方括号,个数小于255
输出描述
匹配就输出一行文本“OK“,不匹配就输出一行文本”Wrong”
思路:题中说明像“[(])”嵌套式的和像“([]()”这样左括号和右括号不相等的属于错误匹配,因此我们得出结论:正确的匹配需要具备左括号和右括号的数量相等且一个左括号旁边只会出现左括号或与他相匹配的右括号。
这道题我们使用栈的思路。
遇到左括号就插入栈中。
if(s[i]=='('||s[i]=='['){
q.push(s[i]);
}
遇到右括号判断前面的括号是否为匹配括号
注意:先要判断栈是否为空,如果为空使用q.pop()会出错。
if(s[i]==')'){
if(q.size()!=0&&q.top()=='(') q.pop();
else{
cout<<"Wrong";
return 0;
}
}
if(s[i]==']'){
if(q.size()!=0&&q.top()=='[') q.pop();
else{
cout<<"Wrong";
return 0;
}
}
最后注意要判断栈是否为空,如果不为空也属于错误匹配。
if(q.size()!=0) cout<<"Wrong";
else cout<<"OK";
代码如下:
#include<iostream>
#include<stack>
using namespace std;
stack<char> q;
int main(){
string s;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='['){
q.push(s[i]);
}
if(s[i]==')'){
if(q.size()!=0&&q.top()=='(') q.pop();
else{
cout<<"Wrong";
return 0;
}
}
if(s[i]==']'){
if(q.size()!=0&&q.top()=='[') q.pop();
else{
cout<<"Wrong";
return 0;
}
}
}
if(q.size()!=0) cout<<"Wrong";
else cout<<"OK";
return 0;
}
二.队列(queue)
1.队列同样属于线性表,具有“先进先出”的特点。
2.头文件
#include<queue>
3.定义方法
queue<int> k;
4.基本函数及用法
k.push(x);//向队尾插入一个元素x
k.pop();//查找队首元素
k.empty();//判断队列是否为空
K.size();//返回k队列的长度
k.frond();//取K队列的队首元素
k.back();//取k队列的队尾元素
5.队列的用法举例
题目:周末舞会
题目描述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。(0<m,n,k<1000)
输入描述
第一行男士人数m和女士人数n;
第二行舞曲的数目k。
输出描述
共k行,每行两个数,表示配对舞伴的序号,男士在前,女士在后。
思路:用两个队列不停的从对头取出元素输出并放到队尾。
代码如下:
#include<iostream>
#include<queue>
using namespace std;
queue<int> a;
queue<int> b;
int n,m,k;
int main(){
cin>>m>>n>>k;
for(int i=1;i<=n;i++){
a.push(i);
}
for(int i=1;i<=m;i++){
b.push(i);
}
while(k--){
int x=b.front(),y=a.front();
cout<<x<<" "<<y<<"\n";
b.push(x),a.push(y);
b.pop(),a.pop();
}
return 0;
}