栈和队列总结

文章目录

  • 前言
  • 一、栈和队列的实现
    • 1.栈的具体实现
    • 2.循环顺序队列的具体实现
  • 二、栈和队列总结
  • 总结


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。


一、栈和队列的实现

  在栈和队列中我们学习了栈和队列的概念和定义(学废了),下面给出其具体实现。

1.栈的具体实现

#include <iostream>
#include <string.h>
using namespace std;

#define maxsize 10

#define ok 1
#define fail 0
#define true 1
#define false 0
#define Not_Exist -1
#define overflow -2

typedef int Status;
typedef int Elemtype;

typedef struct {
	Elemtype* bottom;
	Elemtype* top;
	int Stacksize;
}SqStack;

//初始化,创建顺序栈
Status CreatStack(SqStack& s)
{
	s.bottom = new Elemtype[maxsize];
	if (!s.bottom)return fail;
	s.top = s.bottom;
	s.Stacksize = maxsize;

	return ok;
}
//入栈
Status Push(SqStack& s,Elemtype e)
{
	if (s.top - s.bottom == s.Stacksize)return overflow;
	*s.top = e;
	s.top++;
	return ok;
}
//出栈
Status Pop(SqStack& s, Elemtype& e)
{
	if (s.top == s.bottom)return overflow;
	s.top--;
	e = *s.top;
	return ok;
}
//得到栈顶元素
Status Gettop(SqStack s, Elemtype& e)
{
	if (s.top == s.bottom)return overflow;
	e = *(s.top-1);
	return ok;
}
//销毁顺序栈
Status Destorystack(SqStack& s)
{
	delete[] s.bottom;
	return ok;
}
//清空顺序栈,逻辑上,实际空间中仍然存储着之前的元素
Status Clearstack(SqStack& s)
{
	s.top = s.bottom;
	return ok;
}
//检测顺序栈是否空
Status Stackempty(SqStack s)
{
	if (s.bottom == s.top)
		return true;
	return	false;
}
//检测顺序栈是否满
Status Stackfull(SqStack s)
{
	if (s.top - s.bottom == s.Stacksize)
		return true;
	return	false;
}
//返回顺序栈已用长度,即入栈元素个数
Status Stacklength(SqStack s)
{
	return s.top-s.bottom;
}

SqStack s;
Elemtype e;
int n;
int main()
{
	CreatStack(s);
	Push(s, 'A');
	Push(s, 'b');
	Push(s, 'C');

	Gettop(s, e); cout << e << endl;
	Pop(s, e); cout << e << endl;
	cout << Stacklength(s) << endl;
	cout << Stackfull(s) << endl;
	cout << Clearstack(s) << endl;
	cout << Stackempty(s) << endl;

	return 0;
}

  测试现象:
在这里插入图片描述

2.循环顺序队列的具体实现

#include <iostream>
#include <string.h>
using namespace std;

#define maxsize 10

#define ok 1
#define fail 0
#define true 1
#define false 0
#define Not_Exist -1
#define overflow -2

typedef int Status;
typedef int Elemtype;

typedef struct {
	Elemtype* base;
	int front;
	int rear;
	int Queuesize;
}SqQueue;

//初始化,创建循环顺序队列
Status CreatQueue(SqQueue& q)
{
	q.base = new Elemtype[maxsize];
	if (!q.base)return fail;
	q.rear = q.front = 0;
	q.Queuesize = maxsize;

	return ok;
}
//入队
Status EntryQ(SqQueue& q, Elemtype e)
{
	if ((q.rear + 1) % q.Queuesize == q.front)return overflow;
	q.base[q.rear] = e;
	q.rear++;
	q.rear %= q.Queuesize;
	return ok;
}
//出队
Status OutQ(SqQueue& q, Elemtype& e)
{
	if (q.front == q.rear)return overflow;
	e = q.base[q.front];
	q.front++;
	q.front %= q.Queuesize;
	return ok;
}
//得到循环顺序队列队头元素
Status Getfront(SqQueue q, Elemtype& e)
{
	if (q.front == q.rear)return overflow;
	e = q.base[q.front];
	return ok;
}
//销毁循环顺序队列
Status DestoryQueue(SqQueue& q)
{
	delete[] q.base;
	return ok;
}
//清空循环顺序队列,逻辑上,实际空间中仍然存储着之前的元素
Status ClearQueue(SqQueue& q)
{
	q.front = q.rear = 0;
	return ok;
}
//检测循环顺序队列是否空
Status Queueempty(SqQueue q)
{
	if (q.front == q.rear)
		return true;
	return	false;
}
//检测循环顺序队列是否满
Status Queuefull(SqQueue q)
{
	if ((q.rear + 1) % q.Queuesize == q.front)
		return true;
	return	false;
}
//返回循环顺序队列已用长度,即入队元素个数
Status Queuelength(SqQueue q)
{
	return (q.rear - q.front + q.Queuesize) % q.Queuesize;
}

SqQueue q;
Elemtype e;
int main()
{
	CreatQueue(q);
	EntryQ(q, 'A');
	EntryQ(q, 'b');
	EntryQ(q, 'C');

	Getfront(q, e); cout << e << endl;
	OutQ(q, e); cout << e << endl;
	cout << Queuelength(q) << endl;
	cout << Queuefull(q) << endl;
	cout << ClearQueue(q) << endl;
	cout << Queueempty(q) << endl;

	return 0;
}

  测试现象:
在这里插入图片描述

二、栈和队列总结

(1)栈是限定仅在表尾进行插入或删除的线性表,又称为后进先出(LIFO)的线性表。栈有两种存储表示,顺序表示(顺序栈)和链式表示(链栈)。栈的主要操作是进栈和出栈,对于顺序栈的进栈和出栈操作要注意判断栈满或栈空。
(2) 队列是一种先进先出(FIFO)的线性表。它只允许在表的一端进行插入, 而在另一端删除元素。队列也有两种存储表示,顺序表示(循环队列)和链式表示(链队)。队列的主要操作是进队和出队,对于顺序的循环队列的进队和出队操作要注意判断队满或队空。凡是涉及队头或队尾指针的修改都要将其对队列最大容量求模。


总结

  路漫漫其修远兮,吾将上下而摆烂。
  有任何疑问和补充,欢迎交流。(但我显然不会)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【启明智显技术分享】ESP32系列WiFi无线空中抓包指南

前言&#xff1a; 本文档旨在介绍 windows10 系统下网卡抓包工具(AC-1200)的驱动安装过程、Omnipeek 软件安装过程及Omnipeek软件与网卡抓包工具配合抓包的演示过程。 1、抓包工具(AC-1200)驱动安装 1.1 准备好抓包工具及厂家提供的抓包工具驱动文件 1.2 插上 USB 网卡&…

Linux——socket套接字与udp通信

目录 一、理解IP地址与端口 二、socket套接字 三、TCP与UDP的关系 四、网络字节序 五、socket编程 1.socket()创建套接字 2.填充sockaddr_in 结构体 3.bind() 绑定信息 4.recvfrom()接收消息 5.sendto()发送消息 六、UdpServer代码 一、理解IP地址与端口 IP地址是In…

Leetcode—1256. 加密数字【中等】Plus(bitset、find_first_not_of、erase)

2024每日刷题&#xff08;120&#xff09; Leetcode—1256. 加密数字 实现代码 class Solution { public:string encode(int num) {string ans;num 1;while(num ! 0) {ans to_string(num & 1);num num >> 1;}if(ans.empty()) {return "";} else {stri…

17 如何设计一锤子买卖的SDK

在前三个模块里&#xff0c;我将微服务根据目的性划分为三大类&#xff1a;读、写与扣减类&#xff0c;并针对每一大类涉及的各项技术问题讲解了应对方案。其实&#xff0c;每一类微服务除了本身业务特点涉及的技术问题外&#xff0c;在纯技术维度也有很多共性问题&#xff0c;…

房产中介小程序高效开发攻略:从模板到上线一站式服务

对于房产中介而言&#xff0c;拥有一个高效且用户友好的小程序是提升业务、增强客户黏性的关键。而采用直接复制模板的开发方式&#xff0c;无疑是实现这一目标的最佳途径&#xff0c;不仅简单快捷&#xff0c;而且性价比极高。 在众多小程序模板开发平台中&#xff0c;乔拓云网…

docker容器通俗理解

前言 如果大家没使用过Docker,就在电脑上下载一个VMware Workstation Pro&#xff0c;创建一个虚拟机安装一个windows操作一下感受一下,为什么我的电脑上还以再安装一台windows主机&#xff1f;其实你可以理解为Docker就是Linux系统的一个虚拟机软件。 我的Windows也可以安装…

WMS仓库库存管理软件如何优化工厂的仓库管理-亿发

如果一家工厂没有专业的WMS仓储软件支撑&#xff0c;管理原材料、辅料、半成品和产成品等环节可能会面临诸多问题。 在仓库管理方面&#xff0c;缺乏安全库存的管理会导致库存不足或过剩&#xff0c;而没有及时的缺货分析可能会导致生产中断。全凭人工核算剩余库存和订单质检的…

金价大跳水,美梦变噩梦!2024真正适合普通人的靠谱创业项目!2024适合30-40岁轻资产小生意

4月22日晚间&#xff0c;向上“狂飙”了一个多月的金价突然就“大跳水”。当日&#xff0c;每克金价均下调14块。在这次跳水中&#xff0c;有人欢喜有人愁&#xff1a;有投资者自报做空金价一夜狂赚14万&#xff0c;也有投资者哭诉&#xff0c;头晚进货到早上就净亏损2万&#…

Android 11 bindService 流程分析

我们可以使用bindService来跨进程通信&#xff0c;其使用方法如下 Intent intent new Intent("xxx"); intent.setPackage("xxx"); boolean result bindService(intent,new ServiceConn(),BIND_AUTO_CREATE);private class ServiceConn implements Servi…

STM32入门_江协科技_1~2_OB记录的自学笔记_STM32简介

1.综述 1.1. 课程简介 手打代码是加入了实操&#xff0c;增加学习效果&#xff1b; STM最小系统板面包板的硬件平台&#xff1b; 配套0.96寸的显示屏&#xff0c;便于调试&#xff1b; 因为使用面板板&#xff0c;所以如果程序现象不出来也有可能是硬件连接的问题&#xff1b; …

Allegro画PCB时如何只删除走线的一部分

如何只删除走线的一部分 1、第一步&#xff1a; 2、第二步&#xff1a; 3、第三步&#xff0c;点击相应的走线段就能删除了。 说明&#xff1a;上面的Cline和Line只的是电线和线,您按下删除后,就可以删除这两种东西,但删除的是一整条折线.把这两个取消掉,换成Cline Segs和Ot…

【代码随想录刷题记录】LeetCode283移动零

题目地址 1. 思路 1.1 基本思路及假设 拿到这个题&#xff0c;首先想到&#xff0c;这是类似删除元素的方法&#xff0c;因为删除元素也是移动元素&#xff0c;但是移动的方向和删除元素的方法刚好相反&#xff0c;我们都知道&#xff0c;如果在数组中删除某个元素&#xff…

【Docker】docker部署lnmp和wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

vue2主体页面进行拆分

目录 一.组件化 二.新建Header.vue页面 三.Aside.vue代码 四.Main.vue代码如下 五.Home.vue代码如下 六.index.js代码如下&#xff1a; 七.项目效果图 在Vue.js 2中&#xff0c;将主体页面进行拆分是一种常见的做法&#xff0c;它有助于提高代码的可维护性和可读性。页面…

js实现简单的级联下拉列表

代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script src"js/jquery.min.js" type"text/javascript" charset"utf-8"></script><st…

Linux的磁盘分区,格式化,挂载

1.需要提前添加几个磁盘&#xff0c;以做实验 2.把nvme0n2磁盘用来分区实验 3.分了一个主分区&#xff0c;和一个扩展分区&#xff08;扩展分区是不能使用的&#xff0c;所以又在扩展分区里分了一个逻辑分区&#xff09;分区的大小自己定义 4.格式化分出来的区&#xff0c;这…

618不可错过的数码好物精选!等等党必看清单汇总

无论是追求高效工作的职场人士&#xff0c;还是热爱科技、追求品质生活的消费者&#xff0c;都希望能找到那些既实用又富有创新精神的数码好物&#xff0c;现在正值618购物狂欢节来临之际&#xff0c;我精心为大家挑选了一份不可错过的数码好物清单&#xff0c;这份清单不仅汇聚…

App一键直达,Xinstall助力提升用户体验

在这个移动互联网时代&#xff0c;App已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;每当我们在浏览器或社交平台上看到一个有趣的App推荐&#xff0c;点击下载后却往往要经历一系列繁琐的跳转和确认过程&#xff0c;这无疑大大降低了用户体验。那么&#xff0c;…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

Git 常用命令大全

&#x1f680; Git安装与基础知识学习 &#x1f310; &#x1f3af; Git作为一款全球开发者广泛使用的分布式版本控制系统&#xff0c;能够有效帮助团队协作并追踪项目历史版本。接下来&#xff0c;我们将详细展开Git的安装流程、基础命令操作、高级用法以及应对常见问题的方法…
最新文章