第二课 栈_队列_堆

内容概览及预备知识:

预备知识:栈与队列:

STL基本的栈操作(stack):

 1 #include <iostream>
 2 using namespace std;
 3
 4 #include <stack>
 5 int main(){
 6     stack <int> stk;
 7     if(stk.empty()){ //判断是否为空 isempty()
 8         cout <<"The Stack is empty!!!"<<endl;
 9     }
10     stk.push(5); //压栈
11     stk.push(6);
12     stk.push(10);
13
14     cout <<"The Stack‘ top is " <<stk.top()<<endl;
15     stk.pop(); //弹出栈顶
16     stk.pop();
17     cout <<"The Stack‘ top is "<<stk.top()<<endl;
18     cout <<"The Stack‘ size is "<<stk.size()<<endl; //栈中的size
19
20     return 0;
21 }

STL基本的队列操作(queue):

 1 #include <iostream>
 2 using namespace std;
 3
 4 #include <queue>
 5 int main(){
 6     queue <int> quu;
 7     if(quu.empty()){
 8         cout << "The Queue is empty!"<<endl;
 9     }
10     quu.push(5); //加入队列
11     quu.push(6);
12     quu.push(10);
13
14     cout<<"The Queue‘ front is "<<quu.front()<<endl;
15     quu.pop(); //从队列头拿出
16     quu.pop();
17     cout<<"The Queue‘ front is "<<quu.front()<<endl;//队头
18     quu.push(1);  //队列后加入 1
19     cout<<"The Queue‘ back is "<<quu.back()<<endl; //队尾
20
21
22     cout<<"The Queue‘ size is "<<quu.size()<<endl; //队列的大小
23
24     return 0;
25 }

例1:使用队列实现栈 (No.225):

思路及代码:

假设前4个已经调整好了,下面是如何调整第五个!!!

代码:

 1 class MyStack{
 2 public:
 3     MyStack(){}
 4     void push(int x){
 5         queue <int> temp_queue; //临时队列
 6         temp_queue.push(x);
 7         while(!_data.empty()){ //将_data中的数据push 到临时队列
 8             temp_queue.push(_data.front());
 9             _data.pop();
10         }
11         while(!temp_queue.empty()){ //将 temp_queue中重新放入到_data中
12              _data.push(temp_queue.front());
13              temp_queue.pop();
14         }
15     }
16
17     int pop(){
18         int x = _data.front();
19         _data.pop();
20         return x;
21     }
22
23     int top(){
24         return _data.front();
25     }
26
27     bool empty(){
28         return _data.empty();
29     }
30 private:
31     queue <int> _data; // _data中存储的是 栈存储的顺序
32 };

 1 #include <iostream>
 2 using namespace std;
 3
 4 #include <queue>
 5
 6 class MyStack{
 7 public:
 8     MyStack(){}
 9     void push(int x){
10         queue <int> temp_queue; //临时队列
11         temp_queue.push(x);
12         while(!_data.empty()){ //将_data中的数据push 到临时队列
13             temp_queue.push(_data.front());
14             _data.pop();
15         }
16         while(!temp_queue.empty()){ //将 temp_queue中重新放入到_data中
17              _data.push(temp_queue.front());
18              temp_queue.pop();
19         }
20     }
21
22     int pop(){
23         int x = _data.front();
24         _data.pop();
25         return x;
26     }
27
28     int top(){
29         return _data.front();
30     }
31
32     bool empty(){
33         return _data.empty();
34     }
35 private:
36     queue <int> _data; // _data中存储的是 栈存储的顺序
37 };
38
39
40
41 int main(){
42     MyStack * stk = new MyStack();
43     stk->push(2);
44     stk->push(4);
45     stk->push(8);
46     int a = stk->pop();
47     int b = stk->top();
48     bool c = stk->empty();
49     cout <<a <<b<<c<<endl;
50
51     return 0;
52 }

view code

例2:使用栈实现队列 (No.232):

思路及代码:

和例1一样,先假设已经有了四个元素,现在准备插入第五个元素,就是如何将5 放到栈的最下面!!!

 1 class MyQueue{
 2 public:
 3     MyQueue(){}
 4     void push(int x) {
 5         //先将原有的栈中元素都出栈  进入临时栈中 temp_stk
 6         stack <int> temp_stk;
 7         while(!_data_stk.empty()){
 8             temp_stk.push(_data_stk.top());
 9             _data_stk.pop();
10         }
11         _data_stk.push(x);  //将要加入的放到临时栈中
12         while(!temp_stk.empty()){  //最后再将临时中的元素全部转回到data_stack中
13             _data_stk.push(temp_stk.top());
14             temp_stk.pop();
15         }
16     }
17
18     int pop(){
19         int x = _data_stk.top();
20         _data_stk.pop(); //返回类型是void
21         return x;
22     }
23     int peek(){ //front
24         return _data_stk.top();
25     }
26     bool empty(){
27         return _data_stk.empty();
28     }
29
30 private:
31     stack <int> _data_stk;
32 };

LeetCode 代码

 1 #include <iostream>
 2 using namespace std;
 3
 4 #include <stack>
 5
 6 class MyQueue{
 7 public:
 8     MyQueue(){}
 9     void push(int x) {
10         //先将原有的栈中元素都出栈  进入临时栈中 temp_stk
11         stack <int> temp_stk;
12         while(!_data_stk.empty()){
13             temp_stk.push(_data_stk.top());
14             _data_stk.pop();
15         }
16         _data_stk.push(x);  //将要加入的放到临时栈中
17         while(!temp_stk.empty()){  //最后再将临时中的元素全部转回到data_stack中
18             _data_stk.push(temp_stk.top());
19             temp_stk.pop();
20         }
21     }
22
23     int pop(){
24         int x = _data_stk.top();
25         _data_stk.pop(); //返回类型是void
26         return x;
27     }
28     int front(){ //peek()
29         return _data_stk.top();
30     }
31     bool empty(){
32         return _data_stk.empty();
33     }
34
35 private:
36     stack <int> _data_stk;
37 };
38
39
40 int main(){
41
42     return 0;
43 }

本地

例3:包含min函数的栈(No.155):

思路及代码:

例4:(No.):

思路及代码:

原文地址:https://www.cnblogs.com/zach0812/p/11787486.html

时间: 2024-12-14 16:43:18

第二课 栈_队列_堆的相关文章

栈、队列、堆

新年伊始 再破一谜团 区别参考: 队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间.即动态分配内存,对其访问和对一般内存的访问没有区别. {堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出).} 栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方. 对于堆,我们可以随心所欲的进行增加变量和删除变量

栈、队列、堆随笔

1/ Leetcode 225 使用队列实现栈 1. 队列的初始化: Queue是接口,队列由链表实现 : Queue<> q = new LinkedList<>(); 2.Queue的基本使用方法: offer        添加一个元素并返回true        如果队列已满,则返回false poll          移除并返问队列头部的元素    如果队列为空,则返回null peek        返回队列头部的元素              如果队列为空,则返回n

3.1_栈和队列_栈

[栈的定义] 栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 栈又称为后进先出(Last In First Out)线性表,简称LIFO结构. (PS:定义中的表尾是指 栈顶!) [几个关键词 ] [ 栈顶(top) ] 允许插入和删除的一端称为 栈顶. [ 栈底(bottom) ] 栈顶的另一端称为 栈底. [ 空栈 ] 不含任何数据元素的栈. [栈的插入操作——进栈(push)] 栈的插入操作,叫做进栈,也称为压栈.入栈. [栈的删除操作——出栈(pop)] 栈的删除操作,叫做出

常见的线性列表结构---【数组、链表、栈、队列、堆】

我们在算法设计当中最常见的线性结构列表无非是一下几种: 1.数组: 数组应该是我最常用的一种.他的存储地址是连续的,就是当我们新开辟一个数组时,我们会给他分配一个连续的地址.由于他的地址是连续的,所以在我们知道他下标的时候,查找元素的速度非常快. 2.链表: 链表中的元素的位置不固定,链表中的每一个结点都一个头指针与尾指针,通过这样把链表中的元素连接起来,所以查找一个元素的时间与该元素所处的位置有关系.但是他在空间上面占有优势. 3.栈: 栈中的元素有一个特点,就是保持" 先进先出"的

《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了生命. 本章学习重点: 理解抽象数据类型(ADT)的概念 学习如何对表进行有效的操作 熟悉栈ADT及其在实现递归方面的应用 熟悉队列ADT及其在操作系统和算法设计中的应用 ADT 抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充. 对于每

数据结构(08)_队列和栈的相互实现

1. 栈的队列的相互实现 思考:栈和队列在实现上非常相似,能否用相互实现? 1.1. StackToQueue 用栈实现队列等价于用"后进先出"的特性实现"先进先出"的特性.实现思路: 准备两个栈用于实现队列:stack_in和stack_out 入队列:当有新元素入队时,将其压入队列stack_in 出队列:当需要出队时:1.stack_out.size() == 0,将stack_in中的数据逐一弹出并压人stack_out(数据移动)2.stack_out.s

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

3-9-模拟银行排队过程-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 模拟银行排队过程 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SinglyLinkedList.c.LinkQueue