【Weiss】【第03章】栈例程

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

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

不多说,放代码。

测试代码

 1 #include <iostream>
 2 #include "stack.cpp"
 3 using namespace std;
 4 using namespace stack;
 5 template class Stack<int>;
 6 int main(void)
 7 {
 8     Stack<int> number;
 9
10     //测试入栈
11     cout << "/*additem()*/" << endl;
12     number.push(2);
13     number.push(3);
14     number.push(5);
15     number.push(7);
16     number.push(11);
17     number.traverse();
18     cout << "\n/*end*/\n\n" << flush;
19
20     //测试获取长度
21     cout << "/*length()*/" << endl;
22     cout << number.size() << endl;
23     cout << "/*end*/\n\n" << flush;
24
25     //测试获得头元素
26     cout << "/*getfirst()*/" << endl;
27     cout << number.getfirst() << endl;
28     cout << "/*end*/\n\n" << flush;
29
30     //测试出栈
31     cout << "/*remove()*/" << endl;
32     number.pop();
33     number.pop();
34     number.traverse();
35     cout << "\n/*end*/\n\n" << flush;
36
37     //测试清空,并测试从空表中出栈
38     cout << "/*clear(),remove()*/" << endl;
39     number.clear();
40     number.pop();
41     cout << "/*end*/\n\n" << flush;
42
43     system("pause");
44 }

stack_driver

主体代码

  1 #include <iostream>
  2 using namespace std;
  3 #ifndef STACK
  4 #define STACK
  5
  6 namespace stack
  7 {
  8
  9 //节点模板
 10 template <typename T> struct Node
 11 {
 12     Node<T>() : next(nullptr){}
 13     Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
 14     T data;
 15     Node<T>* next;
 16 };
 17 //头节点及主体操作
 18 template <typename T> class Stack
 19 {
 20 //构造函数
 21 public:
 22     Stack<T>() : length(0), front(nullptr){}
 23 //接口
 24 public:
 25     //返回长度
 26     unsigned int size()const{ return length; }
 27     //返回头指针
 28     Node<T>* begin()const{ return front; }
 29     //判断是否为空
 30     bool empty()const{ return length == 0; }
 31     //获得头元素
 32     T getfirst()const{ return front->data; }
 33     //#查找元素所在地址
 34     Node<T>* find(const T &item)const;
 35     //#入栈
 36     bool push(const T &item);
 37     //#出栈
 38     bool pop();
 39     //#遍历并输栈元素
 40     void traverse()const;
 41     //#清空栈
 42     void clear();
 43
 44 //辅助函数
 45 private:
 46     //#查找元素前驱
 47     Node<T>* find_prev(const T& item)const;
 48 //数据
 49 private:
 50     unsigned int length;
 51     Node<T>* front;
 52 };
 53
 54 //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
 55 template <typename T> Node<T>* Stack<T>::find_prev(const T& item)const
 56 {
 57     if (length == 0)
 58         return nullptr;
 59     if (front->data == item)
 60         return nullptr;
 61     for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
 62     {
 63         if (iter->next->data == item)
 64             return iter;
 65     }
 66     return nullptr;
 67 }
 68 //调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
 69 template <typename T> Node<T>* Stack<T>::find(const T &item)const
 70 {
 71     Node<T>* iter = find_prev(item);
 72     if (length == 0)
 73         return nullptr;
 74     if (front->data == item)
 75         return front;
 76     return iter->next;
 77 }
 78 template <typename T> bool Stack<T>::push(const T &item)
 79 {
 80     Node<T>* pnew = new Node<T>(item);
 81     pnew->next = front;
 82     front = pnew;
 83     ++length;
 84     return true;
 85 }
 86 template <typename T> bool Stack<T>::pop()
 87 {
 88     if (length == 0)
 89     {
 90         cout << "No data!" << endl;
 91         return false;
 92     }
 93     Node<T>* save = front;
 94     front = front->next;
 95     delete save;
 96     --length;
 97     return true;
 98 }
 99 template <typename T> void Stack<T>::traverse()const
100 {
101     if (length != 0)
102     {
103         for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
104             cout << iter->data << ends;
105     }
106 }
107 template <typename T> void Stack<T>::clear()
108 {
109     Node<T>* iter;
110     while (front != nullptr)
111     {
112         iter = front;
113         front = front->next;
114         delete iter;
115     }
116     front = nullptr;
117     length = 0;
118 }
119 }
120 #endif
时间: 2024-12-20 06:06:39

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

【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为右栈,刚好用完每一个单元. 实现代码: 1 //练习3.21新增,

第03章-VTK系统概述(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] 本章旨在介绍VTK系统的总体概述,并讲解运用C++.Java.Tcl和Python等语言进行VT

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第03章 | 字符串

第03章: 使用字符串 ------ 支持的操作 索引 切片 增加元素 删除元素 更新元素 查找元素(检查某个元素是否是序列中的一员) 序列长度 最大值 最小值 其他内建函数 >>> website='http://www.python.org' >>> website[-3:]='com' #此操作不合法,因为字符串是不变,不能做修改 Traceback (most recent call last): File "<pyshell#162>&q

JavaScript权威指南第03章 类型、值和变量

类型.值和变量 数据类型分类: 原始类型(primitive type):数字 字符串 布尔值 null undefined 对象类型(object type): 对象是属性的集合,每个属性都由"名/值"对构成. javascript解释器有自己的内存管理机制,可以自动对内存进行垃圾回收. 3.1数字 javascript不区分浮点和整型,所有的数字都是按照浮点型处理. 3.1.1整型直接量 3.1.2浮点型直接量 3.1.3算数运算 3.1.4二进制浮点数和四舍五入错误 当进行小数进

JavaScript权威指南第03章 类型、值和变量(2)

题目链接:https://oj.leetcode.com/problems/set-matrix-zeroes/ Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 一个个找肯定会超时,我们可以分别用一个行向量和一个列向量进行维护.这样O(m*n) 能出来 class Solution { public: void setZeroes(vector<vector

第03章-VTK系统概述(3)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本节对应原书中的第29页至第39页] 3.2创建VTK应用程序 本章内容包括利用Tcl,C++

第4章 栈与队列

栈(stack)是限定仅在表尾进行插入和删除操作的线性表,即后进先出(LIFO,Last In First Out).如浏览器上的"后退"按钮. ADT 栈(stack) Data 同线性表.元素具有相同的类型,相邻元素具有前驱和后继关系. Operation Initstack(*S);初始化操作,建立一个空栈S. DestroyStack(*S);若栈存在,则销毁它. ClearStack(*S);将栈清空. StackEmpty(S);若栈为空,返回true;否则返回false.

第04章 栈和队列

栈 队列 优先级队列 本章涉及到的三种存储数据类型:栈 队列 优先级队列 本章涉及到的存储数据类型是算法构思的辅助工具,而不仅仅是存储数据的工具.数据结构的生命周期比较短,在程序结束时,对应的数据结构的生命周期随之结束. 栈 队列 优先级队列是比较抽象的数据结构,通过接口对三种数据结构进行定义和实现,而实现的过程对用户来说是屏蔽的. 栈 (后进先出) 栈只允许访问一个数据项,即最后插入的项,当最后一项被移除时,才能对倒数第二项进行操作,依次类推. 栈的操作有两种,入栈和出栈,push  pop.

groovy入门 第03章 字符串和正则表达式

字符串和正则表达式 3.1字符串字面值 可以使用单引号.双引号.三引号来封装字符串. 使用单引号封装的字符串就是字符串序列本身. 使用双引号可以嵌套单引号,并可以将表达式包含进来. 使用三引号可以包含多行文本. def age=25 'My age is ${age}'            // 输出My age is ${age} "My age is ${age}"           //输出My age is 25 """'My age is $