【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.证明,如果 ...
随机推荐
- python3下scrapy爬虫(第二卷:初步抓取网页内容之直接抓取网页)
上一卷中介绍了安装过程,现在我们开始使用这个神奇的框架 跟很多博主一样我也先选择一个非常好爬取的网站作为最初案例,那么我先用屌丝必备网站http://www.shaimn.com/xinggan/作为 ...
- python3多进程爬虫(第一卷)
进程这个东西概念很多人很模糊,而多进程并发爬虫也算是爬虫几大难点,现在我先说下进程的基本使用: 开启一个python文件 函数sayhi就是一个进程而且是主进程 现在呢我想循环输出NAME,n 正常我 ...
- 使用junit测试springMVC项目提示ServletContext找不到定义错误
原文链接:https://blog.csdn.net/liu_gan/article/details/78400627 @RunWith(SpringJUnit4ClassRunner.class) ...
- php--小数点问题
1.用round去小数点后两位时,有时候会出现很长的小数解决方法 sprintf("%.2f",round($total_fee,2)); 使用sprintf再截取一遍.出现变态小 ...
- MUI 提问框多个按钮的回调函数
var btns = new Array("按钮1", "按钮2"); mui.confirm("这是信息", "这是标题&quo ...
- 地理位置(Geolocation)API 简介
一.开篇简述 Geolocation API(地理位置应用程序接口)提供了一个可以准确知道浏览器用户当前位置的方法.且目前看来浏览器的支持情况还算不错(因为新版本的IE支持了该API),这使得在不久之 ...
- Python---13靠谱的Pycharm安装详细教程
昨天自学廖雪峰老师的python课程时,用的sublime编辑器,在命令行模式进行的输出,输出结果一直报错,说Python版本有问题,但在版本是满足要求的.最后在同事的电脑上运行了一下,是可以正常输出 ...
- 编程语言十万个为什么之java web的基础概念
1.什么是JAVA Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, Ja ...
- Mongo Delete-19
数据初始化 db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: &q ...
- 关于js传送json到.net后台处理
这里的内容好像跟标题不太符合,应该是如何实现将请求得到的结果作为另一个请求的请求参数,方法就是使用json处理配合全局变量进行处理 今天做项目遇到以下情景,页面请求获得一个list数据,然后要将得到的 ...