写栈比队列更简单一些,毕竟只有一个数据出入口。

之前用C在程序里模拟栈代替递归的时候,直接搞个数组来实现都是非常轻松愉快的事情。

不多说,放代码。

测试代码

 #include <iostream>
#include "stack.h"
using namespace std;
using namespace stack;
template class Stack<int>;
int main(void)
{
Stack<int> number; //测试入栈
cout << "/*additem()*/" << endl;
number.push();
number.push();
number.push();
number.push();
number.push();
number.traverse();
cout << "\n/*end*/\n\n" << flush; //测试获取长度
cout << "/*length()*/" << endl;
cout << number.size() << endl;
cout << "/*end*/\n\n" << flush; //测试获得头元素
cout << "/*getfirst()*/" << endl;
cout << number.getfirst() << endl;
cout << "/*end*/\n\n" << flush; //测试出栈
cout << "/*remove()*/" << endl;
number.pop();
number.pop();
number.traverse();
cout << "\n/*end*/\n\n" << flush; //测试清空,并测试从空表中出栈
cout << "/*clear(),remove()*/" << endl;
number.clear();
number.pop();
cout << "/*end*/\n\n" << flush; system("pause");
}

主体代码

 #ifndef STACK
#define STACK
#include <iostream>
using namespace std; namespace stack
{ //节点模板
template <typename T> struct Node
{
Node<T>() : next(nullptr){}
Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
T data;
Node<T>* next;
};
//头节点及主体操作
template <typename T> class Stack
{
//构造函数
public:
Stack<T>() : length(), front(nullptr){}
//接口
public:
//返回长度
unsigned int size()const{ return length; }
//返回头指针
Node<T>* begin()const{ return front; }
//判断是否为空
bool empty()const{ return length == ; }
//获得头元素
T getfirst()const{ return front->data; }
//#查找元素所在地址
Node<T>* find(const T &item)const;
//#入栈
bool push(const T &item);
//#出栈
bool pop();
//#遍历并输栈元素
void traverse()const;
//#清空栈
void clear(); //辅助函数
private:
//#查找元素前驱
Node<T>* find_prev(const T& item)const;
//数据
private:
unsigned int length;
Node<T>* front;
}; //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
template <typename T> Node<T>* Stack<T>::find_prev(const T& item)const
{
if (length == )
return nullptr;
if (front->data == item)
return nullptr;
for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
{
if (iter->next->data == item)
return iter;
}
return nullptr;
}
//调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
template <typename T> Node<T>* Stack<T>::find(const T &item)const
{
Node<T>* iter = find_prev(item);
if (length == )
return nullptr;
if (front->data == item)
return front;
return iter->next;
}
template <typename T> bool Stack<T>::push(const T &item)
{
Node<T>* pnew = new Node<T>(item);
pnew->next = front;
front = pnew;
++length;
return true;
}
template <typename T> bool Stack<T>::pop()
{
if (length == )
{
cout << "No data!" << endl;
return false;
}
Node<T>* save = front;
front = front->next;
delete save;
--length;
return true;
}
template <typename T> void Stack<T>::traverse()const
{
if (length != )
{
for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
cout << iter->data << ends;
}
}
template <typename T> void Stack<T>::clear()
{
Node<T>* iter;
while (front != nullptr)
{
iter = front;
front = front->next;
delete iter;
}
front = nullptr;
length = ;
}
}
#endif

【Weiss】【第03章】栈例程的更多相关文章

  1. 【Weiss】【第03章】练习3.21:单数组模拟双栈

    [练习3.21] 编写仅用一个数组而实现两个栈的例程.除非数组的每一个单元都被使用,否则栈例程不能有溢出声明. Answer: 很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引. 如l ...

  2. 第03章 AOP前奏

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

  3. 数据结构(c语言版,严蔚敏)第3章栈和队列

    第3章栈和队列

  4. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

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

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

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

  7. 【Weiss】【第03章】链表例程的一些修改

    主要是,感觉原来的链表例程通过Node的分配形成了链表,但是没有自动消除Node的办法比较危险,一旦在clear()之前把链表赋了其它值就内存泄漏了. 所以改了析构函数,自动清理分配出来的内存.既然改 ...

  8. 【Weiss】【第03章】链表例程

    这种基础例程,如之前所提,会有一个实现和一个简单的测试代码. 链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧. 下面这个是测试代码 #include <iostream ...

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

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

随机推荐

  1. Java IO: Reader And Writer

    原文链接 作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStre ...

  2. 使用GitBook编写项目文档

    GitBook简介 GitBook 是使用 GitHub / Git 和 Markdown(或AsciiDoc)构建漂亮书籍的命令行工具(和Node.js库): GitBook 可以将您的内容作为网站 ...

  3. SpringBoot自动配置的原理

    Spring Boot的运行是由注解@EnableAutoConfiguration提供的它的关键功能是@Import注解.        EnableAutoConfigurationImportS ...

  4. Mongdb创建 连接过程

    在bin目录下启动后 Show dbs 显示库,库里有内容才会显示库名称 Use admin 切换库 没有的默认创建 show users显示用户信息 Show collections显示表名 db. ...

  5. Proto3使用指南

    这篇指南讲述如何使用Protocol Buffers来结构化你的Protocol Buffer数据,包括.proto文件语法以及如何从.proto文件生成你的访问类型.本文主要涵盖了proto3的语法 ...

  6. ActiveMQ学习总结(一)

    自己写的网上商城项目中使用了ActiveMQ,虽然相比于RabbitMQ,kafka,RocketMQ等相比,ActiveMQ可能性能方面不是最好的选择,不过消息队列其实原理区别不大,这里对学过的关于 ...

  7. MySQL增、删、改、查基础操作(C++)

    系统平台:Centos7 MySQL版本:5.7.19 连接MySQL数据库 MySQL::MySQL(string host, string user, string passwd, string ...

  8. sms短信服务

    短信服务是app,电商类应用的基础功能.典型场景有: 用户注册,发送验证码 用户找回验证,发送验证码 用户账户异常,发送提示 用户账户变化,通知用户 短信服务开发有几个注意点: 供应商选型 短信模板 ...

  9. IO和流

    I/O和流 I/O是Input和Output的缩写 从读写设备,包括硬盘文件,内存,键盘输入,屏幕输出,网路 输入输出"内容"(字节或文本) 流是对输入输出设备的一种抽象 从流中读 ...

  10. 5G时代,会有什么奇葩事儿?

    ​ 在3GPP RAN第187次会议关于5G短码方案的讨论中,中国华为推荐的PolarCode方案获得认可,成为5G控制信道eMBB场景编码的最终解决方案.坦白讲,笔者在读这个新闻的时候,手里备着一本 ...