STL库算法的基本整理

一.栈(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值