数据结构之栈和队列应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
案 例
数据结构之栈与队列
重庆电子工程职业学院软件学院
前言 Introduction
数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据 元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的 逻辑结构,数据的存储结构和数据的运算。
逻辑结构就是数据之间的关系。而按数据之间的关系来说,逻辑结构大概可以分为两种: 线性结构和非线性结构(集合、树、网)。
存储结构是逻辑结构的存储映像。常见的存储结构有顺序存储、链式存储、索引存储以及 散列存储(哈希表)。
线性表
线性表(Linear list)是最简单且最常用的一种数据结构。这种结构具有下列特点: 存在一个唯一的没有前驱的(头)数据元素; 存在一个唯一的没有后继的(尾)数据元素; 每一个数据元素均有一个直接前驱和一个直接后继的数据元素。 例如: ➢ 英文字母表(A,B,C,…,Z)是一个长度为26的线性表,其中的每一个字母就是一个数据元素; ➢ 某公司2006年每月产值表(400,420,500,…,600,650)(单位:万元)是一个长度为12的线性表,其中的每一个 数值就是一个数据元素。
构建队列1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
20
40
队首
Sample Output 1 7 19 1 19 37
构建队列2: 1 3 5 7 9 11 13 15 17 19
队首
队列应用:新兵训练
问题描述
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡
case '(': case '[':s.push(str[i]);break; case ')':if(s.top()=='(')s.pop();else return false; break; case ']':if(s.top()=='[')s.pop();else return false; break; }
报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续
从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数,直到剩下的人数不超过三人为止。
Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
队尾(tail)
栈应用:括Βιβλιοθήκη Baidu匹配
问题描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的
长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3 [(])
获取符号字符串 [ ( ] ) \0
(])
([[]()]) 样例输出
构建栈:
No
No
Yes
…
([
bool match(char str[],int length){ stack<char> s; for(int i=0;i<length;i++){ switch(str[i]){
队列:
出队
q0
q1
…
qi
qi+1
…
qn-1
进队
队首(head)
允许插入的一端称为队尾(tail),另一端称为队头(head)
➢ 第一个进队的元素在队首, ➢ 最后一个进队的元素在队尾, ➢ 第一个出队的元素为队首元素, ➢ 最后一个出队的元素为队尾元素 队列的特点:先进先出FIFO(First In First Out)
从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数,直到剩下的人数不超过三人为止。
Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input 2
Output 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input 2
构建队列1: 1 3 7 9 13 15 19
20
40
队首
Sample Output 1 7 19 1 19 37
构建队列2: 1 3 5 7 9 11 13 15 17 19
ABCDE…Z
400
420
500
… 600
650 ^
栈与队列
栈和队列也是线性表,不过是两种特殊的线性表。 栈只允许在表的一端进行插入或删除操作,而队列只允许在表的一端进行插入操作、而在另一端进行删除操作。 因而,栈和队列也可以被称作为操作受限的线性表。
栈:
出栈
top
bottom
进栈
an
…
a2 a1 a0
}
if(s.empty())return true;
else return false;
}
队列应用:新兵训练
问题描述
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡
报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续
队首
队列应用:新兵训练
问题描述
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡
报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
➢ 第一个进栈的元素在栈底, ➢ 最后一个进栈的元素在栈顶, ➢ 第一个出栈的元素为栈顶元素, ➢ 最后一个出栈的元素为栈底元素 栈的特点:后进先出LIFO(Last In First Out)
栈与队列
栈和队列也是线性表,不过是两种特殊的线性表。 栈只允许在表的一端进行插入或删除操作,而队列只允许在表的一端进行插入操作、而在另一端进行删除操作。 因而,栈和队列也可以被称作为操作受限的线性表。
数据结构之栈与队列
重庆电子工程职业学院软件学院
前言 Introduction
数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据 元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的 逻辑结构,数据的存储结构和数据的运算。
逻辑结构就是数据之间的关系。而按数据之间的关系来说,逻辑结构大概可以分为两种: 线性结构和非线性结构(集合、树、网)。
存储结构是逻辑结构的存储映像。常见的存储结构有顺序存储、链式存储、索引存储以及 散列存储(哈希表)。
线性表
线性表(Linear list)是最简单且最常用的一种数据结构。这种结构具有下列特点: 存在一个唯一的没有前驱的(头)数据元素; 存在一个唯一的没有后继的(尾)数据元素; 每一个数据元素均有一个直接前驱和一个直接后继的数据元素。 例如: ➢ 英文字母表(A,B,C,…,Z)是一个长度为26的线性表,其中的每一个字母就是一个数据元素; ➢ 某公司2006年每月产值表(400,420,500,…,600,650)(单位:万元)是一个长度为12的线性表,其中的每一个 数值就是一个数据元素。
构建队列1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
20
40
队首
Sample Output 1 7 19 1 19 37
构建队列2: 1 3 5 7 9 11 13 15 17 19
队首
队列应用:新兵训练
问题描述
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡
case '(': case '[':s.push(str[i]);break; case ')':if(s.top()=='(')s.pop();else return false; break; case ']':if(s.top()=='[')s.pop();else return false; break; }
报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续
从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数,直到剩下的人数不超过三人为止。
Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
队尾(tail)
栈应用:括Βιβλιοθήκη Baidu匹配
问题描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的
长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3 [(])
获取符号字符串 [ ( ] ) \0
(])
([[]()]) 样例输出
构建栈:
No
No
Yes
…
([
bool match(char str[],int length){ stack<char> s; for(int i=0;i<length;i++){ switch(str[i]){
队列:
出队
q0
q1
…
qi
qi+1
…
qn-1
进队
队首(head)
允许插入的一端称为队尾(tail),另一端称为队头(head)
➢ 第一个进队的元素在队首, ➢ 最后一个进队的元素在队尾, ➢ 第一个出队的元素为队首元素, ➢ 最后一个出队的元素为队尾元素 队列的特点:先进先出FIFO(First In First Out)
从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数,直到剩下的人数不超过三人为止。
Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input 2
Output 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input 2
构建队列1: 1 3 7 9 13 15 19
20
40
队首
Sample Output 1 7 19 1 19 37
构建队列2: 1 3 5 7 9 11 13 15 17 19
ABCDE…Z
400
420
500
… 600
650 ^
栈与队列
栈和队列也是线性表,不过是两种特殊的线性表。 栈只允许在表的一端进行插入或删除操作,而队列只允许在表的一端进行插入操作、而在另一端进行删除操作。 因而,栈和队列也可以被称作为操作受限的线性表。
栈:
出栈
top
bottom
进栈
an
…
a2 a1 a0
}
if(s.empty())return true;
else return false;
}
队列应用:新兵训练
问题描述
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡
报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续
队首
队列应用:新兵训练
问题描述
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡
报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
➢ 第一个进栈的元素在栈底, ➢ 最后一个进栈的元素在栈顶, ➢ 第一个出栈的元素为栈顶元素, ➢ 最后一个出栈的元素为栈底元素 栈的特点:后进先出LIFO(Last In First Out)
栈与队列
栈和队列也是线性表,不过是两种特殊的线性表。 栈只允许在表的一端进行插入或删除操作,而队列只允许在表的一端进行插入操作、而在另一端进行删除操作。 因而,栈和队列也可以被称作为操作受限的线性表。