数据结构 栈与队列

栈是一种 == 后进先出( LIFO)== 的数据结构,它是一种线性的、有序的数据结构。栈的基本操作有两个,即入栈和出栈。入栈指将元素放入栈顶,出栈指将栈顶元素取出。栈的本质是一个容器,它可以存储任何类型的数据,但是栈的大小是固定的,因为它的元素只能在栈顶添加或删除。
栈有许多应用场景,比如我们在浏览网页时,可以使用浏览器的 “返回” 功能,这就是栈的应用之一。当我们浏览网页时,每次点击链接都会将新的页面加入到栈中,而当我们点击 “返回” 按钮时,就会将栈顶的页面弹出,这样就可以回到之前的页面了。另外,栈还可以用于括号匹配、表达式求值等问题的解决。

队列

队列是一种==先进先出( FIFO )==的数据结构,它与栈相似,也是一种线性的、有序的数据结构。队列的基本操作有三个,即入队、出队和查看队首元素。入队指将元素放入队尾,出队指将队首元素取出。队列的本质也是一个容器,它可以存储任何类型的数据,但是队列的大小也是固定的。
队列也有很多应用场景,比如操作系统中的进程调度。操作系统中有很多进程需要运行,操作系统通过队列来管理这些进程。当一个进程需要运行时,就将它加入到队列的队尾,当操作系统分配到一个 CPU 时,就将队首的进程取出来运行,这样就可以保证每个进程都能得到运行的机会。

除了以上应用场景外,栈和队列还有很多其他的应用,比如栈还可以用于实现递归算法,队列用于广度优先搜索(BFS)等。

栈的基本操作

顺序栈

#include <iostream>
using namespace std;
#include <stdlib.h>
#define STACKSIZE 10
#define INCRE 2
struct sqstack
{int *base;int top;int stacksize;
};
//顺序栈的初始化:为顺序栈预分配STACKSIZE个空间
void initStack(sqstack &s)
{s.base = new int[STACKSIZE];if (!s.base){exit(1);}s.top = 0;s.stacksize = STACKSIZE;
}
//判断顺序栈是否为空栈,若是空栈,则返回true,否则返回false
bool stackEmpty(sqstack s)
{return s.top==0;
}
//判断顺序栈是否满,满则返回true,否则返回false
bool stackFull(sqstack s)
{return s.top>=s.stacksize;
}
//将数据元素e压入顺序栈
void push(sqstack &s,int e)
{if (stackFull(s)){int *newBase = new int[s.stacksize + INCRE];if (!newBase){exit(1); }for (int i = 0; i < s.stacksize; i++){newBase[i] = s.base[i];}s.base = newBase;s.stacksize += INCRE;}s.base[s.top++]=e;
}
//出栈,并返回出栈元素
int pop(sqstack &s)
{if (stackEmpty(s)){exit(1);}return s.base[--s.top];
}
//获取并返回栈顶元素
int gettop(sqstack &s)
{if (stackEmpty(s)){exit(1);}return s.base[s.top - 1];
}int main()
{sqstack s;initStack(s);for(int i=1; i<=20; i++){push(s,i);}while(!stackEmpty(s)){cout<<pop(s)<<" ";}return 0;
}
#include <iostream>
using namespace std;
#include <stdlib.h>
#define STACKSIZE 10
#define INCRE 2
struct sqstack
{int *base;int *top;int stacksize;
};
//顺序栈的初始化:为顺序栈预分配STACKSIZE个空间
void initStack(sqstack &s)
{s.base = new int[STACKSIZE];if (!s.base){exit(1); }s.top = s.base;s.stacksize = STACKSIZE;
}
//判断顺序栈是否为空栈,若是空栈,则返回true,否则返回false
bool stackEmpty(sqstack s)
{return s.top==s.base;
}
//判断顺序栈是否满,满则返回true,否则返回false
bool stackFull(sqstack s)
{return s.top-s.base>=s.stacksize;
}
//将数据元素e压入顺序栈
void push(sqstack &s,int e)
{if (stackFull(s)){int *newBase = new int[s.stacksize + INCRE];if (!newBase){exit(1);}for (int *p = s.base; p != s.top; ++p){newBase[p - s.base] = *p;}delete[] s.base;s.base = newBase;s.top = s.base + s.stacksize;s.stacksize += INCRE;}*(s.top++) = e;
}
//出栈,并返回出栈元素
int pop(sqstack &s)
{if (stackEmpty(s)){exit(1);}return *(--s.top);
}
//获取并返回栈顶元素
int gettop(sqstack &s)
{if (stackEmpty(s)){exit(1); }return *(s.top - 1);
}int main()
{sqstack s;initStack(s);for(int i=1; i<=20; i++){push(s,i);}while(!stackEmpty(s)){cout<<pop(s)<<" ";}return 0;
}

链式栈

#include <iostream>
using namespace std;
#include <stdlib.h>
struct SNode{int data;SNode *next;
};
typedef SNode *linkStack;
void initStack(linkStack& s) {s = NULL;
}
bool stackEmpty(linkStack s) {return s == NULL;
}
void push(linkStack& s, int e) {SNode* newNode = new SNode;newNode->data = e;newNode->next = s;s = newNode;
}
int pop(linkStack& s) {if (stackEmpty(s)) {exit(1); }int e = s->data;SNode* temp = s;s = s->next;delete temp; return e;
}
int main(){int m;linkStack s;initStack(s);cin>>m;do {push(s,m%2);m=m/2;} while(m!=0);while(!stackEmpty(s)){cout<<pop(s);}
}

链式栈的设计与实现

#include <iostream>
using namespace std;
#include <stdlib.h>
struct snode{int data;snode *next;
};
typedef snode *linkstack;
void initStack(linkstack &top){top=NULL;
}
void push(linkstack &top,int e){snode* newNode = new snode;newNode->data = e;newNode->next = top;top = newNode;
}
bool stackEmpty(linkstack top){return top==NULL;
}
int pop(linkstack &top){if (stackEmpty(top)) {exit(1); }int e = top->data;snode* temp = top;top = top->next;delete temp;return e;
}
void pop(linkstack &top,int &e){if (stackEmpty(top)) {exit(1);}e = top->data;snode* temp = top;top = top->next;delete temp;
}
int getTop(linkstack top){if (stackEmpty(top)) {exit(1);}return top->data;
}
void converse(int m,linkstack &s){initStack(s);do {push(s, m % 2);m = m / 2;} while (m != 0);
}
int main(){linkstack s;int m;cin>>m;converse(m,s);while(!stackEmpty(s)){cout<<pop(s);}return 0;
}

队列的基本操作

循环队列

#include <iostream>
using namespace std;
#include <stdlib.h>
#define MAX 100
struct circleQueue
{int data[MAX];int front,rear;int count;
};
void initQueue(circleQueue &Q)
{Q.front = Q.rear = 0;Q.count = 0;
}
bool queueEmpty(circleQueue &Q)
{return Q.count == 0;
}
bool queueFull(circleQueue &Q)
{return Q.count == MAX;
}
void enQueue(circleQueue &Q, int value)
{if (queueFull(Q)){exit(1);}Q.data[Q.rear] = value;Q.rear = (Q.rear + 1) % MAX;Q.count++;
}
int deQueue(circleQueue &Q)
{if (queueEmpty(Q)){exit(1);}int frontValue = Q.data[Q.front];Q.front = (Q.front + 1) % MAX;Q.count--;return frontValue;
}
int getFront(circleQueue &Q)
{if (queueEmpty(Q)){cout << "empty!" << endl;exit(1);}return Q.data[Q.front];
}
int main()
{int m;cin>>m;circleQueue Q;initQueue(Q);for(int i=1; i<=m; i++){enQueue(Q,i*2-1);}cout<<getFront(Q)<<endl;while(!queueEmpty(Q)){cout<<deQueue(Q)<<" ";}
}

链式队列

#include <iostream>
using namespace std;
#include <stdlib.h>
struct QNode
{int data;QNode *next;
};
struct LinkQueue
{QNode *front;QNode *rear;
};
void initQueue(LinkQueue &Q)
{Q.front = Q.rear = NULL;
}
bool queueEmpty(LinkQueue &Q)
{return Q.front == NULL;
}
void enQueue(LinkQueue &Q, int value)
{QNode *newnode = new QNode;newnode->data = value;newnode->next = NULL;if (queueEmpty(Q)){Q.front = newnode;Q.rear = newnode;}else{Q.rear->next = newnode;Q.rear = newnode;}
}
int deQueue(LinkQueue &Q)
{if (queueEmpty(Q)){cout << "empty!" << endl;exit(1);}int frontvalue = Q.front->data;QNode *temp = Q.front;Q.front = Q.front->next;delete temp;if (Q.front == NULL){Q.rear = NULL;}return frontvalue;
}
int getFront(LinkQueue &Q)
{if (queueEmpty(Q)){cout << "empty!" << endl;exit(1);}return Q.front->data;
}
int main()
{int m;cin>>m;LinkQueue Q;initQueue(Q);for(int i=1; i<=m; i++){enQueue(Q,i*2-1);}cout<<getFront(Q)<<endl;while(!queueEmpty(Q)){cout<<deQueue(Q)<<" ";}
}

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

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

相关文章

String转Date,Date转String

源码&#xff1a; Date currentTime new Date();System.out.println("currentTime:"currentTime);SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString formatter.format(currentTime);System.out.println(&quo…

【深度学习】学习率及多种选择策略

学习率是最影响性能的超参数之一&#xff0c;如果我们只能调整一个超参数&#xff0c;那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量&#xff0c;当学习率最优时&#xff0c;模型的有效容量最大。本文从手动选择学习率到使用预热机制…

qt msvc2010 qdatetime.h:122: error: C2589: “(”:“::”右边的非法标记

报错内容&#xff1a; C:\Qt\Qt5.4.0\5.4.0\msvc2010_opengl\include\QtCore\qdatetime.h:114: error: C2589: “(”:“::”右边的非法标记 C:\Qt\Qt5.4.0\5.4.0\msvc2010_opengl\include\QtCore\qdatetime.h:114: error: C2059: 语法错误:“::” 解决方法&#xff1a; 打开qd…

2023小红书Android面试之旅

一面 自我介绍 看你写了很多文章&#xff0c;拿你理解最深刻的一篇出来讲一讲 讲了Binder相关内容 Binder大概分了几层 哪些方法调用会涉及到Binder通信 大概讲一下startActivity的流程&#xff0c;包括与AMS的交互 全页面停留时长埋点是怎么做的 我在项目中做过的内容&am…

RocketMQ-NameServer详解

前言 ​ RocketMQ架构上主要分为四部分, Broker、Producer、Consumer、NameServer&#xff0c;其他三个都会与NameServer进行通信。 Producer: ​ **消息发布的角色&#xff0c;可集群部署。**通过NameServer集群获得Topic的路由信息&#xff0c;包括Topic下面有哪些Queue&a…

PTA-病毒感染检测

人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。然后检测某种病毒DNA序列是否在患者的DNA序列中出现过&#xff0c;如果出现过&#xff0c;则此人感染了该病毒&#xff0c;否则没有感染。例如&#xff0c;假设病毒的DNA序列为baa&#xff0c;患者1的DNA序列为aaabbba&am…

数据结构与算法编程题15

设计一个算法&#xff0c;通过遍历一趟&#xff0c;将链表中所有结点的链接方向逆转&#xff0c;仍利用原表的存储空间。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; …

【从入门到起飞】JavaSE—多线程(3)(生命周期,线程安全问题,同步方法)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;生命周期&#x1f384;线程的安全问题&#…

【Leetcode合集】1410. HTML 实体解析器

1410. HTML 实体解析器 1410. HTML 实体解析器 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""…

YOLOv7独家改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c …

开发抖音小游戏什么技术

开发抖音小游戏&#xff0c;使用以下技术可能会相对简单&#xff1a; HTML5&#xff1a;HTML5 是一种用于创建网页和应用程序的标准标记语言。它具有丰富的功能和灵活性&#xff0c;可以在各种设备和平台上运行&#xff0c;包括移动设备和浏览器。HTML5 提供了许多游戏开发所需…

大模型AI Agent 前沿调研

前言 大模型技术百花齐放&#xff0c;越来越多&#xff0c;同时大模型的落地也在紧锣密鼓的进行着&#xff0c;其中Agent智能体这个概念可谓是火的一滩糊涂。 今天就分享一些Agent相关的前沿研究&#xff08;仅限基于大模型的AI Agent研究&#xff09;&#xff0c;包括一些论…

完美解决AttributeError: module ‘numpy‘ has no attribute ‘typeDict‘

文章目录 前言一、完美解决办法安装低版本1.21或者1.19.3都可以总结 前言 这个问题从表面看就是和numpy库相关&#xff0c;所以是小问题&#xff0c;经过来回调试安装numpy&#xff0c;发现是因为目前的版本太高&#xff0c;因此我们直接安装低版本numpy。也不用专门卸载目前的…

Qt全球峰会2023中国站 参会概要

Qt全球峰会2023中国站 参会概要 前言峰会议程签到 & Demo 演示开场致辞Qt Group 产品总监演讲&#xff08;产品开发的趋势-开放的软件、工具和框架&#xff09;产品战略QtQuick or QtWidgets&#xff08;c or qml&#xff09;Qt如何定义AI个人看法 Qt 在券商数字化转型和信…

【MySQL】内连接和外连接

内连接和外连接 前言正式开始内连接外连接左外连接右外连接 前言 前一篇讲多表查询的时候讲过笛卡尔积&#xff0c;其实笛卡尔积就算一种连接&#xff0c;不过前一篇讲的时候并没有细说连接相关的内容&#xff0c;本篇就来详细说说表的连接有哪些。 本篇博客中主要用到的还是…

快速去除Word文档密码,全面解决你的困扰

如果你忘记了Word文档密码&#xff0c;或者想解密和去除Word文档密码&#xff0c;下面是简单步骤&#xff1a;第一步&#xff0c;百度搜索【密码帝官网】找到官方网站&#xff1b;第二步&#xff0c;点击“立即开始”&#xff0c;进入用户中心&#xff0c;上传需要解密的文件。…

中部A股第一城,长沙如何赢商?

文|智能相对论 作者|范柔丝 长沙的马路&#xff0c;都很有故事。 一条解放西路&#xff0c;是全国人民都争相打卡的娱乐地标&#xff1b;一条太平街&#xff0c;既承载了历史的厚重又演绎着现代的鲜活...... 但如果来到河西的桐梓坡路&#xff0c;风景会变得截然不同。 沿…

应用软件安全编程--28SSL 连接时要进行服务器身份验证

当进行SSL 连接时&#xff0c;服务器身份验证处于禁用状态。在某些使用SSL 连接的库中&#xff0c;默认情况下不 验证服务器证书。这相当于信任所有证书。 对 SSL 连接时要进行服务器身份验证的情况&#xff0c;示例1给出了不规范用法(Java 语言)示例。示例2 给出了规范用法(J…

安装MySQL搭建论坛

课前默写&#xff1a; 1、nginx配置文件的区域有哪些 ①全局区域 ②events区域 ③http区域 2、区域模块的作用 全局区域模块主要是用户和工作进程 events区域模块配置最大连接数时需先配置:vim /etc/limits.conf 因为系统默认最大是1024 http区域模块&#xff1a;代理地…

BUUCTF [HBNIS2018]excel破解 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。来源&#xff1a; https://github.com/hebtuerror404/CTF_competition_warehouse_2018 密文&#xff1a; 下载附件&#xff0c;得到一个attachment.xls文件。 解题思路&#xff…