鱼C论坛

 找回密码
 立即注册
查看: 2251|回复: 0

[学习笔记] 链栈

[复制链接]
发表于 2018-4-19 16:20:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
《数据结构C++语言描述》清华大学出版社  任燕编著

小弟改遍了一些程序使之可以作为程序来运行
同时小弟还是老样子重载输出运算符,便于输出链栈每个结点的数据域中的数据
程序小弟调试过没有错

还行大神赐教!!!
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <assert.h>
  4. #include <cstdbool>
  5. using namespace std;

  6. template <typename elemtype>
  7. class LinkStack{
  8. public:
  9.         class LinkNode{
  10.         public:
  11.                 elemtype data;
  12.                 LinkNode *next;
  13.         };

  14.         typedef LinkNode* NodePointer;

  15.         //把链栈置空
  16.         void clear();

  17.         //求链栈中结点的个数
  18.         int getLength();

  19.         //判断链栈是否为空
  20.         bool isEmpty();

  21.         //读取栈顶结点的数据域
  22.         bool getTop(elemtype &e);

  23.         //重载赋值运算符
  24.         LinkStack operator=(LinkStack right);

  25.         //弹出栈顶结点
  26.         bool pop(elemtype &e);

  27.         //在栈顶压入一个数据域为e的结点
  28.         void push(elemtype e);

  29.         LinkStack();//链栈构造函数

  30.         //析构函数
  31.         virtual ~LinkStack();

  32.         //链栈拷贝构造函数
  33.         LinkStack(LinkStack &other);

  34.         template <typename out_put>
  35.         friend ostream& operator<<(ostream& out, LinkStack<out_put> other);

  36. protected:
  37.         NodePointer top;//链栈栈顶指针
  38. };

  39. template <typename elemtype>
  40. void LinkStack<elemtype>::clear(){
  41.         NodePointer s;

  42.         while (top){
  43.                 s = top;
  44.                 top = top->next;
  45.                 delete s;
  46.         }
  47.         top = NULL;
  48. }

  49. template <typename elemtype>
  50. int LinkStack<elemtype>::getLength(){
  51.         int length = 0;
  52.         NodePointer p = this->top;

  53.         while (p){
  54.                 length++;
  55.                 p = p->next;
  56.         }
  57.         return length;
  58. }

  59. template <typename elemtype>
  60. bool LinkStack<elemtype>::getTop(elemtype &e){
  61.         if (!top){
  62.                 return false;
  63.         }
  64.         else{
  65.                 e = top->data;
  66.                 return true;
  67.         }
  68. }

  69. //判断链栈是否为空
  70. template <typename elemtype>
  71. bool LinkStack<elemtype>::isEmpty(){
  72.         return top ? false : true;
  73. }

  74. //重载赋值运算符
  75. template <typename elemtype>
  76. LinkStack<elemtype> LinkStack<elemtype>::operator=(LinkStack<elemtype> right){
  77.         NodePointer p;//左边链栈当前处理结点的指针

  78.         NodePointer rp = right.top;
  79.         NodePointer s;//预指向左边链栈新节点的指针

  80.         if (this != &right){
  81.                 clear();
  82.                 while (rp){
  83.                         s = new LinkNode;
  84.                         assert(s != 0);
  85.                         s->data = rp->data;

  86.                         if (!top){
  87.                                 top = s;
  88.                         }
  89.                         else{
  90.                                 p->next = s;
  91.                         }
  92.                         p = s;
  93.                         rp = rp->next;
  94.                 }
  95.                 if (p){
  96.                         p->next = NULL;
  97.                 }
  98.         }
  99.         return *this;//返回对象
  100. }

  101. //弹栈
  102. template <typename elemtype>
  103. bool LinkStack<elemtype>::pop(elemtype &e){
  104.         NodePointer s = top;
  105.         if (!top){
  106.                 return false;
  107.         }
  108.         else{
  109.                 e = top->data;
  110.                 top = top->next;
  111.                 delete s;
  112.         }
  113.         return true;
  114. }


  115. //压栈
  116. template <typename elemtype>
  117. void LinkStack<elemtype>::push(elemtype e){
  118.         NodePointer s;

  119.         s = new LinkNode;
  120.         assert(s != 0);
  121.         s->data = e;
  122.         s->next = top;
  123.         top = s;
  124. }

  125. template <typename elemtype>
  126. LinkStack<elemtype>::LinkStack(){
  127.         top = NULL;
  128. }

  129. template <typename elemtype>
  130. LinkStack<elemtype>::~LinkStack(){
  131.         clear();
  132.         cout << "清理栈完毕" << endl;
  133. }

  134. //链栈拷贝构造函数
  135. template <typename elemtype>
  136. LinkStack<elemtype>::LinkStack(LinkStack<elemtype> &other){
  137.         NodePointer p;
  138.         NodePointer op = other.top;

  139.         NodePointer s;

  140.         top = p = NULL;

  141.         while (op){//这些代码你懂的
  142.                 s = new LinkNode;
  143.                 assert(s != 0);
  144.                 s->data = op->data;
  145.                 if (!top){
  146.                         top = s;
  147.                         cout << "第一个结点插入中" << endl;
  148.                 }
  149.                 else{
  150.                         p->next = s;
  151.                         cout << "结点插入中" << endl;
  152.                 }
  153.                 p = s;
  154.                 op = op->next;
  155.         }
  156.         if (p){
  157.                 p->next = NULL;//链栈栈底结点的指针置空
  158.         }
  159. }

  160. //输出运算符重载
  161. template <typename out_put>
  162. ostream& operator<<(ostream& out, LinkStack<out_put> other){
  163.         LinkStack<out_put>::NodePointer s = other.top;
  164.         while (s){
  165.                 out << "值:" << s->data << endl;
  166.                 s = s->next;
  167.         }
  168.         return out;
  169. }

  170. int main(void){
  171.         LinkStack<int> s1;
  172.         for (int i = 1; i < 11; i++){
  173.                 s1.push(i);//测试压栈成员函数
  174.         }
  175.         cout << "链栈插入完毕:" << endl;
  176.         cout << "链栈为:" << endl;
  177.         cout << s1 << endl;//测试重载输出运算符
  178.         cout << "弹栈:" << endl;
  179.         for (int i = 1; i < 11; i++){
  180.                 int e;
  181.                 if (s1.pop(e)){//测试弹栈成员函数
  182.                         cout << e << endl;
  183.                 }
  184.         }

  185.         LinkStack<int> s2;
  186.         for (int i = 1; i <= 5; i++){
  187.                 s2.push(i);
  188.         }

  189.         s1 = s2;//测试赋值运算符的重载

  190.         cout << "s1为:" << endl;
  191.         cout << s1;


  192.         return 0;
  193. }



复制代码


运行结果:
链栈插入完毕:
链栈为:
第一个结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
值:10
值:9
值:8
值:7
值:6
值:5
值:4
值:3
值:2
值:1
清理栈完毕

弹栈:
10
9
8
7
6
5
4
3
2
1
第一个结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
第一个结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
清理栈完毕
清理栈完毕
s1为:
第一个结点插入中
结点插入中
结点插入中
结点插入中
结点插入中
值:5
值:4
值:3
值:2
值:1
清理栈完毕
清理栈完毕
清理栈完毕
请按任意键继续. . .

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
理想小青年 + 1 + 1 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 18:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表