线性表,栈和队列(2)

news2024/10/5 13:57:07

作者:额~我那个早过50了,忘记了sorry

言归正传ca

什么是栈?

小李攒钱买了车,可是他家住在胡同的尽头。胡同很窄,只能通过一辆车,而且是死胡同。小李每天都为停车发愁,如果回家早了停在里面,早上上班就要让所有人挪车,先让最外面的车出去,然后挨着一辆一辆的出去,这样小李才能去上班。胡同很窄,只能通过一辆车,而且是死胡同,所以只能从胡同口进出。小汽车呈线性排列,只能从一端进出,后进的汽车先出去,如下图所示:

 这种后进先出的线性序列,称为栈。栈是一种线性表,只不过是它是操作受限的线性表,只能在一端进行进出操作。进出的一端称为栈顶(top),另一端称为栈底(base)。假设栈为∶s=(a1,a2,…,an),那么a1为栈底元素,而an是栈顶元素。栈中的元素是按照a1、a2、…、an的顺序进栈,退栈的第一个元素应为栈顶元素。由于其先进后出的特点,栈又称为先进后出(First In Last Out, FILO)的线性表。

入栈和出栈 

入栈:入栈前要判断是否栈满,如果栈已满,则入栈失败;否则将元素放入栈顶.

出栈:出栈前要判断是否栈空,如果栈是空的,则出栈失败;否则将栈顶元素暂存给一个变量.

stack简介 

栈的英文名就是stack,在C++的STL标准库中提供了一个容器stack来实现栈的基本操作,可以方便的进行出入栈的操作。使用标准库的栈和队列时,先包含相关的头文件#include<stack>定义栈如下:stack<int> s;s.empty() 如果栈为空返回true,否则返回falses.size() 返回栈中元素的个数s.pop() 删除栈顶元素s.top() 返回栈顶的元素s.push() 在栈顶压入新元素**stack没有提供遍历所有元素的方法,不支持下标操作。因此入栈和出栈都需要使用循环实现。下面的代码是利用stack模拟实现1-10个数字的入栈和出栈操作。

#include<iostream>
#include<stack>  //栈的头文件 
using namespace std;
int main()
{
    stack<int> s;  //定义栈
    for(int i=1; i<=10; i++)  //将1-10入栈
    {
        s.push(i);
    }   
    while(!s.empty())     //首先输出栈顶元素,然后将栈顶元素出栈,循环执行,直到栈为空。 
    {
        cout <<s.top()<<" ";  //输出首元素
        s.pop();       //栈顶元素出栈
    }
    return 0;
}

栈相关训练:其实栈的定义以及基本操作都很好理解,但是在一道题目里面要不要用栈,该如何用栈其实还是有一定难度的。我们不妨通过下面几个习题来体会下栈的美妙之处。训练1:括号匹配给定一个只包含左右括号的合法括号序列,按右括号从左到右的顺序输出每一对配对的括号出现的位置(括号序列以0开始编号)。括号序列长度不超过100。输入格式:仅一行,表示一个合法的括号序列。输出格式:设括号序列有n个右括号。则输出包括n行,每行两个整数l,r,表示配对的括号左括号出现在第l位,右括号出现在第r位。输入输出样列:

输入样例:(())()

输出样例:1 20 34 5

解题思路:因为本题出现在栈的训练里面,大家首选用栈去解决,那么如果不是呢?你能看出来这是栈的应用吗?从样例中其实不容易看出规律,我们举一个特殊的例子,例如有这样一个括号((((())))),如果我们想找第一个匹配的括号,其实是找第一个右括号出现的位置,找到右括号的位置之后就是找离它最近的左括号,离他最近的左括号就是在左括号序列里面的最后一个,说到这里,大家是不是感觉有点像栈了,最后进去的左括号先出来,这不就是后进先出的栈吗?想到这里,题目就变得很简单了。我们定义一个栈,然后输入括号字符串,如果是左括号就先保存在栈里面,如果不是(即为右括号)则找离它最近的左括号的位置即栈顶,s.top()表示左括号位置,i表示右括号位置,需要注意的是,当这个左括号完成匹配之后需要出栈。完整的代码如下所示:

#include <iostream>
#include <stack>
#include <string> 
using namespace std;
string a;              //括号序列 
stack<int> s;            //定义栈 
int main()
{
    cin >> a;
    for(int i=0; i<a.size(); i++)
    {
        if(a[i] == '(')  s.push(i);  //如果是左括号将其位置入栈
        else       //如果是右括号,则这个时候离它最近的左括号一定在栈顶 
        {
            cout << s.top() << ' ' << i << endl; //s.top()表示最近左括号的位置,i代表右括号的位置 
            s.pop();    //该左括号匹配完之后需要出栈 
        }
    }
    return 0;
}

训练2:括号匹配升级(主题库1466)topscoding才有

假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如 或[([ ][])]等为正确的匹配,[( ])或(或(( )))均为错误的匹配。本题的任务是检验一个给定表达式中的括号是否正确匹配。输人一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“0K” ,不匹配就输出“Wrong“。输入:一行字符,只含有圆括号和方括号,个数小于255。输出:匹配就输出一行文本“0K",不匹配就输出一行文本“Wrong“。

样例输入:[(])

样例输出:Wrong

解题思路:有了上一题的经验之后,以后在遇到类似括号匹配的问题大家自然而然想到用栈的思想去解决问题,这也就是为什么要多刷题的原因。完整的代码如下: 

#include<bits/stdc++.h>
using namespace std;
stack<char> a;  //字符型栈
char t;
int main() {
    while(cin>>t) {
        if(t=='(') a.push(t);  //左小括号入a栈
        if(t=='[') a.push(t);  //左中括号入a栈
        if(t==')') {     //如果是右小括号
            if(a.empty()==1||a.top()!='(') { //如果这个时候a栈是空的,或者a栈的栈顶不是小括号,表示这个时候匹配不上,输出Wrong
                cout<<"Wrong";
                return 0;
            }
            a.pop();  //如果匹配上了,则出栈
        }
        if(t==']') {   //同理
            if(a.empty()==1||a.top()!='[') {
                cout<<"Wrong";
                return 0;
            }
            a.pop();
        }
    }
    if(a.empty()==1) cout<<"OK"; //右边的找完了,这个时候a栈也应该空了,因此空了就是ok,不空就是wrong,该判断易忽略
    else cout<<"Wrong";
    return 0;
}

队列: 

还记得我们之前讲过的买了新车的小李吗?为了解决胡同停车问题,小李跑了无数次居委会,终于将挡在胡同口的建筑清除了。这样住在胡同尽头的小李就可以早早回家把车停在最里面,并且每天都第一个开车去上班了。现在胡同被打通了,但是胡同还是很窄,只能通过一辆小车。小汽车呈线性排列,只能从一端进,另一端出,如下图所示,先进先出。

这种先进先出(First In First Out,FIFO) 的线性序列,称为“队列”。队列也是一种线性表,只不过它是操作受限的线性表,只能在两端操作:一端进,一端出。进的一端称为队尾(rear),出的一端称为队头(front)。 队列可以用顺序存储,也可以用链式存储。这里我们只侧重讲队列的顺序存储,队列的链式存储了解即可。假设队列为∶q=(a1,az,…,an),那么a1就是队头元素,而an是队尾元素。队列中的元素是按照 a1、a2、…、an的顺序进入的,退出队列时也只能按照这个顺序依次退出,也就是说只有在a1,a2,…,an-1都离开队列以后,an才能退出队列。


 queue简介队列的英文名就是queue,使用队列时,先包含相关的头文件:#include<queue>定义队列如下:queue<int> q;q.empty() 如果队列为空返回true,否则返回falseq.size() 返回队列中元素的个数q.pop()删除队列首元素q.front()返回队首元素的值q.push()在队尾压入新元素q.back() 返回队列尾元素的值**注意∶跟stack类似,queue没有提供遍历所有元素的方法,不支持下标操作。如果需要遍历queue中所有元素,需要一遍调用front(),一边调用pop()。队列相关训练:其实队列的定义以及基本操作都很好理解,但是在一道题目面前要不要用队列,该如何用队列其实还是有一定难度的。我们不妨通过下面几个习题来体会下栈的美妙之处。

例题1:队列的使用

使用queue,实现输入n个数,输出他们的头元素、尾元素、当前队列中元素个数、当前队列是否为空。输入格式: 第一行输入n,第二行输入n个不同的数输出格式: 输出他们的头元素、尾元素、当前队列中元素个数、当前队列是否为空。

样例输入:
5
4 8 7 2 6

样例输出:

4 6 5 0
参考代码:

#include<bits/stdc++.h>
using namespace std;
queue<int> q;
int main(){
    int n,t;
    cin >>n;
    for(int i=1;i<=n;i++){
        cin >> t;
        q.push(t);
    }
    cout << q.front()<< " ";
    cout << q.back()<< " ";
    cout << q.size()<< " ";
    cout << q.empty();
    return 0;
}

例题3:拓尔思舞会2(主题库2627) 

和上题一样,男士们和女士们进入舞厅时,各自排成一队配舞伴。跳完一轮后的男女接到队伍尾部继续排队。不同的是,匹配的过程中,如果发生男女的舞力值相差超过10,那么舞力值低的那一位会离开舞厅,舞力值高的留在原地继续等待匹配下一个舞伴。如果在k支舞曲结束前,有一只队伍全员离开了,舞会就结束了,输出“Over”。输入格式:第1行两个正整数,表示男士人数m和女士人数n (1≤m,n≤1000)第2行m个正整数,表示每位男士的舞力值,第3行n个正整数,表示每位女士的舞力值,第4行一个正整数,表示舞曲的数目k (k≤1000)。输出格式:不超过k行,每行为两个数,用一个空格隔开表示配对舞伴的序号,男士在前,女士在后。如果匹配截止输出Over

样例输入:

2 3
1 15
2 6 11
7

样例输出:

1 2
15 6
1 11
15 6
1 11
15 6
1 11 

解题思路:请自行补充

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int m,n,i,j,t,k;
    cin>>m>>n;
    queue<int>q1,q2;
    for(i=1;i<=m;i++){ cin>>t;  q1.push(t);  }
    for(i=1;i<=n;i++){ cin>>t;  q2.push(t);  }
    cin>>k;
    while(k--)
    {   int t1=q1.front(),t2=q2.front();
        if(abs(t1-t2)<=10)      //如果舞力值相差小于10和上一题思想一致
        {   cout<<t1<<" "<<t2<<endl;
            q1.pop();q2.pop();
            q1.push(t1);q2.push(t2);    
        }
        else   //如果舞力值相差大于10       
        {   if(t1<t2)  q1.pop();  
            else q2.pop();     //较小的出队列 
            if(q1.size()==0||q2.size()==0)
            {   cout<<"Over";return 0;  }  //如果没人了就输出“Over”
            k++;
        }
    }
}

参考答案


#include <bits/stdc++.h>
using namespace std;
int main()
{ 
    int m,n,k,i,t;
    queue<int>boy,girl;
    cin>>m>>n;
    for(i=1;i<=m;i++)
    {
    	cin>>t;
    	boy.push(t);
	}
	for(i=1;i<=n;i++)
	{
		cin>>t;
		girl.push(t);
	}
	cin>>k;
	while(k--)
	{
		if(boy.empty()==1||girl.empty()==1)
		{
			cout<<"Over";
			return 0;
		}
		int t1=boy.front(),t2=girl.front();
		if(abs(t1-t2)<=10)
		{
			cout<<t1<<" "<<t2<<endl;
			boy.push(t1);girl.push(t2);boy.pop();girl.pop();
		}else
		{
			if(t1<t2)
			{
				boy.pop();
			}
			else
			{
				girl.pop();
			}
			k++;
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas笔记:pandas 排序 (sort_values)

1 函数说明 DataFrame.sort_values(by,*, axis0, ascendingTrue, inplaceFalse, kindquicksort, na_positionlast, ignore_indexFalse, keyNone) 2 参数说明 by string或者一组string组成的list&#xff0c;根据什么进行排序 axis{0 or ‘index’, 1 or ‘columns’}ascendi…

其它 Composition API

1.shallowReactive 与 shallowRef shallow有浅的意思 首先在原有的页面上引入它&#xff0c;然后用shallowReactive包裹它 浅层次的意思就是像name&#xff0c;age这些是响应式的&#xff0c;而job就不处理&#xff0c;意思就是只处理第一层数据&#xff0c;像第二层的都不处理…

电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 程序链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》&#xff0c;文献模型提供了一个很好的创新思路&#xff0c;把常规电气互联系统的调度和有功无功优化…

【Linux】-关于Linux的指令(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; TOC 前言 今天我们来讲关于Linux的基本指令&#xff0c;博主讲的指令会对应着Windows…

Java 8中新特性Stream的详细理解和使用

Java 8中新特性Stream的基本理解和使用 Stream基本概念 Stream流是来自数据源的元素队列并支持聚合操作 **元素&#xff1a;**是特定类型的对象&#xff0c;是数据源形成的一个队列。Java中Stream不会存储元素&#xff0c;而是按需计算 数据源&#xff1a;Stream流数据的来…

自定义函数 | R语言批量计算组间差值

批量字符替换、数值大小比较并重新赋值 cal_repeat()函数的实际操作1.不考虑处理变量。考虑多变量和指定2列变量的情况&#xff08;长数据&#xff09;&#xff1a;2.考虑处理变量。考虑多处理&#xff0c;多变量的情况&#xff08;长数据&#xff09;&#xff1a;3.考虑处理变…

Node【Global全局对象】

文章目录 &#x1f31f;前言&#x1f31f;Global全局对象&#x1f31f;Global对象属性与方法&#x1f31f;Global对象属性&#x1f31f;process&#x1f31f;Buffer类&#x1f31f;console &#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;新的专栏 Node 已…

华为OD机试真题(Java),最优策略组合下的总的系统消耗资源数(100%通过+复盘思路)

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度&#xff0c;会得到不同系统消耗的性能。 假设由N个待串行用户&#xff0c;每个用户可以使用A/B/C三种不同的调度策略&#xff0c;不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

netty源码阅读--服务启动

背景 netty是一个非常成熟的NIO框架&#xff0c;众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程&#xff0c;重在理解netty的关键如&#xff1a;如何启动&#xff0c;如何接受网络数据、netty的内存管理机制以及编解码器等&am…

【KingSCADA】如何建立硬件系统及相关变量

小伙伴们大家好&#xff0c;我是雷工&#xff01; 本篇学习了解KingSCADA3.8如何建立硬件系统及相关变量&#xff0c;以下为学习过程和操作记录。 一、前言 本篇主要讲解如何定义设备&#xff0c;如何定义变量。 KingSCADA3.8的采集系统是指负责和现场设备进行通讯&#xff0…

通过azure学生认证拿到一年服务器使用权

通过azure学生认证 因为国内备案被迫找其他服务器 开始我买了一个华为的服务器&#xff0c;大家都知道&#xff0c;在国内&#xff0c;服务器是需要备案的。如果你备案过的话&#xff0c;就知道这个是非常麻烦的事情。时间久不说。过程也是非常的繁琐。这个繁琐的过程&#x…

《Linux基础》06. 进程管理 · 服务管理

Linux基础-06 1&#xff1a;进程管理1.1&#xff1a;查看进程1.1.1&#xff1a;ps1.1.2&#xff1a;pstree1.1.3&#xff1a;top 1.2&#xff1a;终止进程1.2.1&#xff1a;kill1.2.2&#xff1a;killall 2&#xff1a;服务管理2.1&#xff1a;运行级别2.2&#xff1a;服务查看…

每日一练2023.4.17-2023.4.18

数轴上的bfs 农夫约翰被通知&#xff0c;他的一只奶牛逃逸了&#xff01;所以他决定&#xff0c;马上出发&#xff0c;尽快把那只奶牛抓回来&#xff0e; 他们都站在数轴上&#xff0e;约翰在N(0≤N≤100000)处&#xff0c;奶牛在K(0≤K≤100000)处&#xff0e;约翰有 两种办…

门控循环神经网络学习笔记

在介绍门控循环神经网络之前&#xff0c;先简单介绍循环神经网络的基本计算方式&#xff1a; 循环神经网络之称之为“循环”&#xff0c;因为其隐藏状态是循环利用的&#xff1a; 上一次输入计算出的隐藏状态与当前的输入结合&#xff0c;得到当前隐藏状态。 cur_output, cur…

【嵌入式笔/面试】嵌入式软件基础题和真题总结——操作系统

在学习的时候找到几个十分好的工程和个人博客&#xff0c;先码一下&#xff0c;内容都摘自其中&#xff0c;有些重难点做了补充&#xff01; 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

电脑丢失的dll文件怎么一键修复?修复dll方法分享

电脑丢失的dll文件怎么一键修复&#xff1f;电脑状况常常让人遇到各种问题&#xff0c;其中“DLL文件丢失”是最常见的问题之一。在这篇文章中&#xff0c;我们会介绍为何会出现DLL文件丢失的问题&#xff0c;以及提供一种简单、快捷的DLL文件修复方法。 一.为何会出现DLL文件丢…

vue使用vue-mapvgl实现烟台市各区县行政区绘制、三维柱状图

一、效果展示 二、地图组件&#xff1a; vue-mapvgl https://docs.guyixi.cn/vue-mapvgl/#/ 三、代码 main.js //vue-mapvGL import VueBMap from vue-bmap-gl; import vue-bmap-gl/dist/style.css import VueMapvgl from vue-mapvgl; Vue.use(VueBMap); Vue.use(VueMapvg…

c++算法——算法章节-时间空间复杂度

算法开章咯 这次是csp-j组算法 枚举法常用排序合集hash一维前缀和vector结构体queuestack贪心-简单贪心区间递归二分setmap二叉树图的遍历-邻接矩阵迷宫问题-dfs-深度优先搜素bfs-广度优先搜索动态规划-简单动态规划-01背包动态规划-背包-多重背包二分答案 算法是什么嘛&…

腾讯云轻量4核8G12M应用服务器带宽、月流量详细性能评测

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

0基础同学如何快速入门学Python

转自&#xff1a;https://www.zhihu.com/question/596253606/answer/2994169972 想学Python的小伙伴&#xff0c;这里给你们汇总了&#xff1a;学习资源、平台、小白环境配置、相关课程、书籍资料&#xff01;并且&#xff0c;附送学习方法以及计划制定。 一、可以了解到Pyth…