【练习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:单数组模拟双栈的更多相关文章

  1. 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 ...

  2. 第03章 AOP前奏

    第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...

  3. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  4. 题目21 包含Min函数的栈

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目21  包含 ...

  5. 【Weiss】【第03章】增补附注

    基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...

  6. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  7. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  8. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

  9. 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

    [练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...

随机推荐

  1. Junit 单元测试在 intelliJ IDEA 中的安装

    1.为什么使用Junit我们都知道,main 方法是一个程序的入口,通常来说,没有main方法,程序就无法运行.我们经常会写一些class文件(如下图所示),他们并没有自己的main方法.那么我们如何 ...

  2. 用R的dplyr进行数据转换(一)

    在网上找了很久关于数据转换的,都没有找到比较好的.现在为大家整理一下.按照我自己的思路.当然也是为了自己做笔记. 为了方便,大家可以统一安装一个系列的包,这个只需要安装tidyverse这个包就可以, ...

  3. Mac Webstrom 快捷键

    C + D 删除当前行 光标所在行 S + C + F 格式化 S  + C + R 重命名 C + { 查找上次 C + } 查找下次 C + S + DE 回到上一次编程位置 C + F 查找 C ...

  4. 使用itchat发送天气信息

    微信发送当日天气情况 念头萌生 之前在浏览网站的时候发现了篇文章「玩转树莓派」为女朋友打造一款智能语音闹钟,文章中介绍了使用树莓派打造一款语音播报天气的闹钟. 当时就想照着来,也自己做个闹钟.因为一直 ...

  5. Windows下python3登陆和操作linux服务器

    一.环境准备 python3远程连接需要用到pycrytodome和paramiko库,其中后者依赖前者,所以按照顺序来安装 1. 安装pycrytodome 1 pip install pycryt ...

  6. 浅谈.NET Framework 与CLR

            承载公共语言运行时 (CLR) 的所有应用程序均需启动(或称“激活”)CLR 以运行托管代码.             通常,.NET Framework 应用程序在生成它的 CLR ...

  7. 从头认识js-js客户端检测

    常用的客户端检测方式有以下三种: 1.能力检测 2.怪癖检测 3.用户代理检测 能力检测 最常用也是最为人们广泛接受的客户端检测形式是能力检测(又称特性检测).能力检测的目标不是识别特定的浏览器,而是 ...

  8. 分享到微信,QQ等各大网络媒体网站代码

    http://www.jiathis.com/ 打开此网站,如果没有账号,请注册一下,然后登陆账号,进入网页以后直接可以复制代码到页面的标签,进行css样式布局,直接可以在页面测试,如果方便的话直接百 ...

  9. VMware虚拟机从安装到激活再到创建虚拟机解决黑屏、卡、死机系列问题教程第二篇

    第二篇:在VMware中创建一个虚拟机(黑屏死机卡在最下面简单说一下你就懂了) 1.我们要打开我们已经安装好的VMware,然后点击创建新的虚拟机 2.然后选择自定义 3.下面这个默认,直接下一步 4 ...

  10. Layabox enabled 脚本禁用 坑

    从unity入坑到Layabox,真的是一路踩坑啊,今天这个坑叫做 脚本禁用 enabled 问题一: 首先看官方文档 https://ldc2.layabox.com/doc/?nav=zh-ts- ...