1. 栈和队列的数组实现

  • 栈和队列的比较

    栈和队列都属于线性表,且在其上进行Insert和Delete操作所插入和移除的元素是预先设定的。在栈中,在一端插入,在同一端删除,位于该端点的元素称为栈顶元素;在队列中,在一端插入,在另一端删除,位于两端点的元素分别称为队列尾和队列头。

    所以在栈的实现中,需要记录的变量是栈顶元素位置;而在队列的实现中,需要记录的变量有队列头和队列尾的位置。

  • 用数组实现一个栈

    都需要记录哪些信息?栈顶元素下标index,以及数组本身的指针p、总长度MAX_SIZE。

    栈顶元素下标index与其对应的数组元素下标f(index)之间的映射关系是怎样的?随着栈的增长,栈顶元素下标依次为0,1,2...n-1,其中n表示栈的最大高度。我们需要制定一种映射规则f,方便我们通过index计算出f(index)。而最简单的规则就是f(index) = index。

#include<iostream>
template<typename Object>
class Stack
{
public:Stack(){init();}Stack(const Stack& rhs){init();index = rhs.index;for(int i = 0; i != index + 1; ++i)p[i] = rhs.p[i];}Stack(Stack&& rhs):p(rhs.p),index(rhs.index){rhs.p = nullptr;rhs.index = -1;}Stack& operator =(const Stack& rhs){Stack copy(rhs);std::swap(p, copy.p);std::swap(index, copy.index);return *this;}Stack& operator =(Stack&& rhs){std::swap(p, rhs.p);std::swap(index, rhs.index);return *this;}~Stack(){if(p)delete[] p;}void push(const Object& object){if(index == MAX_SIZE-1)std::cerr << "overflow" << std::endl;elsep[++index] = object;}void push(Object&& object){if(index == MAX_SIZE-1)std::cerr << "overflow" << std::endl;elsep[++index] = std::move(object);}void pop(){if(empty())std::cerr << "underflow" << std::endl;else--index;}Object& top(){return p[index];}const Object& top() const{return p[index];}bool empty() const{return index == -1;}
private:static constexpr int MAX_SIZE = 4;Object* p;int     index;void init(){p = new Object[MAX_SIZE];index = -1;}
};
  • 队列的数组实现

    需要保存哪些变量? 队列头下标head、队列长度size(用来计算队列尾下标和判断上溢出、下溢出),数组p和总长度MAX_SIZE。

#include <iostream>
template<typename Object>
class Queue
{
public:Queue(){init();}Queue(const Queue& rhs){init();head = rhs.head;size = rhs.size;for(int i = head, idx; i != head + size; ++i){idx = index(i);p[idx] = rhs.p[idx];}}Queue(Queue&& rhs):head(rhs.head), size(rhs.size),p(rhs.p){rhs.head = -1;rhs.size = 0;rhs.p = nullptr;}Queue& operator =(const Queue& rhs){Queue copy(rhs);std::swap(head, copy.head);std::swap(size, copy.size);std::swap(p, copy.p);return *this;}Queue& operator =(Queue&& rhs){std::swap(head, rhs.head);std::swap(size, rhs.size);std::swap(p, rhs.p);return *this;}~Queue(){if(p)delete[] p;}void enqueue(const Object& object){if(full()){std::cout << "overflow" << std::endl;return;}p[index(head + size++)] = object;}void enqueue(Object&& object){if(full()){std::cout << "overflow" << std::endl;return;}p[index(head + size++)] = std::move(object);}Object tail(){if(empty()){std::cout << "underflow" << std::endl;return Object();}return p[index(head + size - 1)];}Object dequeue(){if(empty()){std::cout << "underflow" << std::endl;return Object{};}Object& object =  p[index(head)];head = index(head + 1);--size;return object;}bool empty() const{return size == 0;}bool full() const {return size == MAX_SIZE;}int getSize() const {return size;}
private:static constexpr int MAX_SIZE = 4;Object* p;int head;int size;void init(){p = new Object[MAX_SIZE];head = size = 0;}inline int index(int i){if(i >= MAX_SIZE)i -= MAX_SIZE;return i;}
};void testQueue()
{using namespace std;struct Student{char name[10];int  age;};Queue<Student> q;q.enqueue(Student{"Tom", 12});q.enqueue(Student{"Micheal", 13});q.enqueue(Student{"Anna", 14});q.enqueue(Student{"Lily", 10});q.enqueue(Student{"James", 19});q.enqueue(q.dequeue());q.enqueue(q.dequeue());q.enqueue(q.dequeue());q.enqueue(q.dequeue());while(!q.empty()){Student stu = q.dequeue();cout << "name:" << stu.name << " age:" << stu.age << endl;}/*outputoverflowname:Tom age:12name:Micheal age:13name:Anna age:14name:Lily age:10*/
}

转载于:https://www.cnblogs.com/meixiaogua/p/10167635.html

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

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

相关文章

玩转oracle 11g(23):区分大小写和字符集不同

7. 11g默认开始密码区分大小写 可以通过把参数设置为 SEC_CASE_SENSITIVE_LOGON FALSE 屏蔽 alter system set SEC_CASE_SENSITIVE_LOGON FALSE scopeboth; 8. 字符集不同 Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character…

树莓派4b装系统_树莓派4B初次使用--系统安装|配置

准备硬件&#xff1a;树莓派本体、读卡器、TF卡、电源线、HDMI连接线(可选)、显示器(可选)软件&#xff1a;SDFormatter格式化工具、Win32DiskImager烧录工具、Finalshell、Cellular-Z技术规格首先&#xff0c;来看看树莓派4的外形&#xff0c;和之前的树莓派3差别不大&#xf…

IntelliJ IDEA——提交代码到GitHub远程库

记录一下在IDEA上怎样将写的代码提交到GitHub远程库&#xff1a; 下面这个图是基本的提交代码的顺序&#xff1a; 将代码Add到stage暂存区 本地修改了代码后&#xff0c;需先将代码add到暂存区&#xff0c;最后才能真正提价到git仓库。 首先&#xff0c;IDEA中&#xff0c;选中…

玩转oracle 11g(24):数据文件设置自扩展和监听日志文件过大处理

10. 数据文件为打开自动扩展 select * from dba_data_files; 查询结果&#xff1a; AUTOEXTENSIBLE MAXBYTES MAXBLOCKS INCREMENT_BY NO 0 0 0 NO 0 0 0 NO 0 …

安装mysql5.6.10_windows下安装mysql(mysql-installer-community-5.6.10.1)详细教程

一、安装前的准备1、下载安装程序包&#xff0c;可到MySQL官方网站www.mysql.com下载&#xff0c;如图1-1&#xff1a;图1-1下载后的安装文件如图1-2所示&#xff1a;图1-2二、安装1、双击下载的安装文件&#xff0c;本篇博文安装的MySQL版本为5.6.10.1&#xff0c;出现如图1-3…

往事不堪回首

UPD&#xff1a;2018/10/9 第一次墙外调查&#xff1a;立个Flag吧&#xff01;第100场&#xff0c;上红&#xff01; 哈哈哈哈哈哈哈哈哈哈&#xff01; 妙啊&#xff01; UPD&#xff1a;2018/10/23 第二次墙外调查&#xff1a;下一场&#xff0c;要不要试着把橙名第二段击穿呢…

玩转oracle 11g(25):手工删除oracle归档日志后操作步骤 和修改用户默认解锁时间

12.手工删除oracle归档日志后操作步骤 1. 开始-》运行-》cmd 2.cmd-> set oracle_siddocare 3.cmd-> rman target / 如果报错&#xff1a;ORA-12560: TNS: 协议适配器错误 安装32bit客户端造成 直接输入&#xff1a; rman target system/docaredocare 4. 将归档日…

mysql 索引计划_Mysql索引、查询计划、优化方向

索引Innodb索引(聚集索引)(聚簇表分布)Innodb是索引组织表&#xff0c;其结构是BTree。其表索引结构是聚簇表分布。其叶子节点保存了KeyRow Data(聚集索引&#xff0c;按主键排序)&#xff0c;其Key是主键或非空的唯一索引。而其二级索引是非主键或者非空的唯一索引。即Innodb表…

[复习]莫比乌斯反演,杜教筛,min_25筛

[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式&#xff1a;\[\begin{aligned}g(n)&\sum_{n|d}f(d)\\f(n)&\sum_{n|d}\mu(\frac{d}{n})g(d)\end{aligned}\] 实际上还有\[\begin{aligned}g(n)&\sum_{d|n}f(d)\\f(n)&\sum_{d|n}\mu(\fra…

玩转oracle 11g(26):误删表数据和误删表回滚

14.误删除表中数据并提交&#xff08;deletecommit&#xff09; select * from med_dept_dict as of timestamp sysdate - 1/1440 描述&#xff1a;其中med_dept_dict 为误删除数据的表 sysdate - 10/1440 表示查询10分钟之前数据 注意&#xff1a;数据来源是查询undo中的撤…

mysql kingshard 扩容_如何用Go打造一个高性能mysql proxy

kingshard架构设计和功能实现kingshard(https://github.com/flike/kingshard)开源有一段时间了&#xff0c;有些热心的用户发邮件来咨询kingshard的设计和实现问题。于是周末抽空写了一篇介绍kingshard架构和功能实现的文章&#xff0c;希望通过本文能够让用户对kingshard有更深…

玩转oracle 11g(27):ora-12154和客户端版本低

16. 64bit windows操作系统上 安装了32bit的oracle alert log 里不断的出现如下错误&#xff1a; OER 7451 in Load Indicator : Error Code OSD-04500: illegal option specified O/S-Error: (OS 1) 函数不正确。! 每10秒出现一次错误提示。 解决方案&#xff1a; 重新安装or…

mysql 命令行 主从复制_MySQL 的主从复制(高级篇)

首先要明白为什么要用 mysql 的主从复制&#xff1a;1–在从服务器可以执行查询工作 (即我们常说的读功能)&#xff0c;降低主服务器压力&#xff1b;(主库写&#xff0c;从库读&#xff0c;降压)2–在从主服务器进行备份&#xff0c;避免备份期间影响主服务器服务&#xff1b;…

方法的重写

方法的重写 1、在子类中可以根据需要对从基类中继承的方法进行重写 2、重写方法必须和被重写方法具有相同对的方法名称&#xff0c;相同的参数列表和返回值类型 3、重写方法不能使用比被重写方法更严格的访问权限 在方法重写的时候注意&#xff1a;对那个方法进行重写尽量copy那…

[Android]安装 Android Studio 第一行Android代码

安装 Android Studio 1.下载 官网 建议官网下载https://developer.android.com/index.html 网盘 链接&#xff1a;https://pan.baidu.com/s/1b8KyEMYbSYt9EQJ2e8Ge6w 提取码&#xff1a;ytn4 《第一行代码》第二版提供版本&#xff08;2016年&#xff09; 2.安装组件全…

玩转oracle 11g(28):ora-00064和程序异常终止

18.ORA-00064 object is too large to allocate on this OS 问题原因&#xff1a; 通过查看告警日志&#xff0c;确认修改的process过大 解决步骤&#xff1a; 使用 D:\oracle\product\10.2.0\admin\docare\pfile\init.ora 启动 操作步骤如下&#xff1a; sqlplus sys/docar…

使用with 创建视图

语法 &#xff1a; create view as with a as () , select * from a ;CREATE VIEW pms_work_hour_viewASWITH tAS (SELECT id,create_name AS name,project_number AS parent_id,(end_date - begin_date) AS times,ROUND ( (end_date - begin_date) / 3600000, 2) A…

android mysql sqlite_Android SQLite数据库基本操作方法

程序的最主要的功能在于对数据进行操作&#xff0c;通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的&#xff0c;Android中内置了小巧轻便&#xff0c;功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一…

[Linux]Ubuntu 以管理员权限打开文件夹

方法一&#xff1a;&#xff08;亲测可用&#xff09; 此操作适合于文件夹有小锁&#xff0c;在root文件夹下操作等。 ubuntu 以管理员权限打开文件夹&#xff1a; 1&#xff0c;右键->在终端打开 2&#xff0c; 在终端中直接输入sudo nautilus 3&#xff0c;想干嘛干嘛…

5G RedCap:轻量5G技术的新宠

嘿&#xff0c;大家好&#xff01;今天我们将深入了解一项引领5G轻量化时代的关键技术——5G RedCap。这项技术可谓是5G发展中的一把新利器&#xff0c;让我们看看它是如何在5G世界中展露头角的。 5G RedCap是什么&#xff1f;轻量化5G技术的精髓 5G RedCap的全名是5G Reduced…