【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.证明,如果 ...
随机推荐
- Hibernate实现步骤
1. 引入jar文件(hibernate3.jar, lib\required目录下所有的jar,log4j记录的log4j-1.2.16.jar,slf4j-log4j12-1.5.8.jar,oj ...
- 6.8.5 使用Lambda表达式调用Arrays的类方法
6.8.5 使用Lambda表达式调用Arrays的类方法 实例 Arrays类的有些方法需要Comparator. XxxOperator.XxxFunction等接口的实例,这些接口都是函数式接口 ...
- Flask添加新命令
代码: import click from flask import Flask app = Flask(__name__) @app.cli.command() def hg(): click.ec ...
- 实现子数组和绝对值差最小 - Objective-C
类似于背包问题,前提条件是数组全是正整数和0,先求和Sum,再从子数组中找出接近Sum/2的子数组 @interface TempState : NSObject @property (nonatom ...
- 一致性哈希算法(consistent hashing)PHP实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...
- 致歉Note7用户后,三星要还给世界下一个机皇
1月23日,三星电子在韩国首尔公布了Note7事件原因调查结果.此次认定过程精密而繁琐,最终结果发布距离三星宣布全球召回Note7已经有3个月. 相比事发之初各路信息甚嚣尘上,现在虽然还不能说已经 ...
- 【深入理解Java虚拟机】类的初始化过程
类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...
- C++走向远洋——60(项目四、立体类族共有的抽象类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——40(第九周,深复制体验)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 漫谈国内外Android生态:华为发布的 HMS 服务,对 Mate30 系列无法搭载 Google GMS 的补偿有多大(原创)
如果既用过iPhone,也用过国际版Android,还用过国内的安卓,(并且这三种都用了半年以上),就能体会到GMS多重要.可以说,iOS的体验大幅度领先于国内的安卓,一多半的原因是国内安卓没有GMS ...