【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.证明,如果 ...
随机推荐
- leetcode第22题:括号生成
力扣上的题目可以大致分为以下种类: 对某种复杂规则的彻底解析,很有可能要构造状态机,充分考虑边界情况. 对某种数据结构及算法的应用. 对数学概念.遍历.动态规划等的综合应用. 通过分析,本题应该属于1 ...
- win7电脑磁盘文件以分组方式展现解决方案
问题: win7电脑磁盘文件以分组方式展现,具体如下: 解决: 右键磁盘空白处-->分组依据-->选择无:图解如下:
- Docker的自动构建镜像
Dockerfile自动构建docker镜像类似ansible剧本,大小几kb手动做镜像:大小几百M+ dockerfile 支持自定义容器的初始命令 dockerfile主要组成部分: 基础镜像信息 ...
- Spring Boot 鉴权之—— JWT 鉴权
第一:什么是JWT鉴权 1. JWT即JSON Web Tokens,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),他可以用来安全的传递信息,因为传递的信息是 ...
- Leetcode 063 不同路径二
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...
- 手术Robot能取代医生吗?
现在,机械自动化已经成为各领域为之神往的大趋势,从工业组装,到智能物流,再到餐饮.银行服务,以及娱乐等等,管理者无不处心积虑地降低成本.提高效率,其中,一个非常重要的手段就是利用机器取代人工.医院,作 ...
- loadrunner通过socket测接口
#include "lrs.h" Action() { //建立到服务端的连接 lrs_create_socket("socket1",&quo ...
- concurrent包分析之Executor框架
文章目录 线程生命周期的开销:线程比较少的情况使用new Thread(task)无多大影响,但是如果涉及到线程比较多的情况,应用的性能就会受到影响,如果jdbc创建连接一样,new Thead创建线 ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C:数组习题
与字符串处理有关的函数: 头文件:<stdio.h> gets().puts() 头文件:<string.h> (1).字符串长度测量函数 :strlen(字符数组名) ...