【Weiss】【第03章】练习3.21:单数组模拟双栈
【练习3.21】
编写仅用一个数组而实现两个栈的例程。除非数组的每一个单元都被使用,否则栈例程不能有溢出声明。
Answer:
很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引。
如left=5则表示array[0]~array[4]为左栈元素,right=7则表示array[8]~array[size-1]为右栈元素。
当左右索引交叉时(left=right+1),0~left-1为左栈,left~size-1为右栈,刚好用完每一个单元。
测试代码:
#include <iostream>
#include "stack.h"
using namespace std;
using namespace stack;
template class Stack<int>;
int main(void)
{
Simu_Double_Stack<int> test();
//测试插入
test.leftpush();
test.leftpush();
test.leftpush();
test.leftpush();
test.leftpush();
test.rightpush();
test.rightpush();
test.rightpush();
test.rightpush();
test.rightpush();
test.rightpush();
//测试打印
test.leftprint();
test.rightprint();
cout << endl;
//测试拷贝
Simu_Double_Stack<int> test2;
test2 = test;
test2.leftprint();
test2.rightprint();
cout << endl;
//证明拷贝为深拷贝
test.leftpush();
test2.leftprint();
cout << endl;
test.leftprint();
cout << endl;
//测试栈满报错
test.leftpush();
test.rightpush();
//测试出栈
test.leftpop();
test.leftpop();
test.rightpop();
test.rightpop();
test.leftprint();
test.rightprint();
//测试栈元素清空
test.leftclear();
test.rightclear();
test.leftprint();
test.rightprint(); system("pause");
}
实现代码:
//练习3.21新增,单数组模拟双栈
template <typename T> class Simu_Double_Stack
{
public:
Simu_Double_Stack() :head(nullptr), left(), right(), size(){}
Simu_Double_Stack(unsigned int _size)
{
head = new T[_size];
size = _size;
left = ;
right = _size - ;
}
Simu_Double_Stack(const Simu_Double_Stack& another)
{
size = another.size;
head = new T[size];
left = another.left;
right = another.right;
for (int i = ; i < size; ++i)
head[i] = another.head[i];
}
~Simu_Double_Stack(){ destory(); }
Simu_Double_Stack& operator=(const Simu_Double_Stack& another)
{
if (&another != this)
{
destory();
size = another.size;
left = another.left;
right = another.right;
head = new T[size];
for (unsigned int i = ; i < size; ++i)
head[i] = another.head[i];
}
return *this;
}
public:
//入栈
bool leftpush(const T& item)
{
if (left <= right)
{
head[left++] = item;
return true;
}
else
{
cout << "Overflow" << endl;
return false;
}
}
bool rightpush(const T& item)
{
if (right >= left)
{
head[right--] = item;
return true;
}
else
{
cout << "Overflow" << endl;
return false;
} }
//出栈
bool leftpop()
{
if (left > )
{
--left;
return true;
}
else
{
cout << "Stack empty" << endl;
return false;
}
}
bool rightpop()
{
if (right < size - )
{
++right;
return true;
}
else
{
cout << "Stack empty" << endl;
return false;
}
}
//获取长度信息
unsigned int leftsize()const{ return left; }
unsigned int rightsize()const{ return size - right - ; }
unsigned int getsize()const{ return size; }
unsigned int getused()const{ return left + size - right - ; }
//打印
void leftprint() const
{
for (unsigned int i = left - ; i != -; --i)
cout << " " << head[i] << flush;
}
void rightprint() const
{
for (unsigned int i = right + ; i != size; ++i)
cout << " " << head[i] << flush;
}
//清空
void leftclear(){ left = ; }
void rightclear(){ right = size - ; }
private:
//释放内存
void destory()
{
left = right = size = ;
delete[] head;
head = nullptr;
}
T* head = nullptr;
unsigned int left;
unsigned int right;
unsigned int size;
};
【Weiss】【第03章】练习3.21:单数组模拟双栈的更多相关文章
- suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...
- 第03章 AOP前奏
第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...
- 第03章_基本的SELECT语句
第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...
- 题目21 包含Min函数的栈
///////////////////////////////////////////////////////////////////////////////////// // 3. 题目21 包含 ...
- 【Weiss】【第03章】增补附注
基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...
- 【Weiss】【第03章】练习3.25:数组模拟队列
[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...
- 【Weiss】【第03章】练习3.16:删除相同元素
[练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...
- 【Weiss】【第03章】练习3.26:双端队列
[练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...
- 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题
[练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...
随机推荐
- vue日常问题总结
1.Vue项目启动后首页URL带的#该怎么去掉? vue-router中默认使用的是hash模式,URL中带有#号,我们可以用如下代码修改成history模式: import Vue from 'vu ...
- Nginx笔记总结三:内核参数优化
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800 net.ipv4.ip_conntrack_max = 16777216 ...
- js 创建对象的多种方式
参考: javascript 高级程序设计第三版 工厂模式 12345678910 function (name) { var obj = new Object() obj.name = name o ...
- 2018年宜賓美酒文化節浮空投影舞美特效 / 2018 Yibing Wine Festival Visual Effect Projection
客户 Client:五粮液集团 硬件 Hardware:PC,巴可投影机30,000流明*2 Barco projector 30,000 lumen*2 软件 Software:Resolume, ...
- nginx安装与fastdfs配置--阿里云
上一篇文章:fastDFS 一二事 - 简易服务器搭建之--阿里云 做了fastDFS的服务安装和配置,接下来我们来看nginx的安装 第一步:安装nginx需要安装的一些环境: 1.例如: yum ...
- Scrapy初体验(一) 环境部署
系统选择centOs 7,Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, ...
- Windows 下 LaTeX 手动安装宏包(package)以及生成帮助文档的整套流程
本文简单介绍如何手动安装一个 LaTeX 宏包. 一般来说,下载的 TeX 发行版已经自带了很多宏包,可以满足绝大部分需求,但是偶尔我 们也可能碰到需要使用的宏包碰巧没有安装的情况,这时我们就需要自己 ...
- hexo文章编写部分语法总结以及hexo使用
一.hexo的使用 1.1 新建一篇文章 1 $ hexo new [layout] <title> 1.2. 生成静态文件 1 $ hexo generate 可简写为 1 $ hexo ...
- LISTAGG函数
官网进入 该函数作用是可以实现对列值得拼接: 根据官网介绍,可以对列值排序进行拼接,也可以分组拼接 1.1运行结果 1.2运行结果 2运行结果 注意该函数提供的 over( partition by ...
- Docker实战之MySQL主从复制
前言 曾几何时,看着高大上的架构和各位前辈高超的炫技,有没有怦然心动,也想一窥究竟?每当面试的时候,拿着单应用的架构,吹着分库分表的牛X,有没有心里慌的一批? 其实很多时候,我们所缺少的只是对高大上的 ...