当前位置: 首页 > news >正文

北邮22信通:(10)第三章 3.2栈的实现

北邮22信通一枚~   

跟随课程进度每周更新数据结构与算法的代码和文章 

持续关注作者  解锁更多邮苑信通专属代码~

上一篇文章:

北邮22信通:(9)实验1 题目六:模拟内存管理(搬运官方代码)_青山如墨雨如画的博客-CSDN博客

下一篇文章:

目录

3.2.1顺序栈

代码部分:

运行结果:

遇到问题:

运行结果:

3.2.2链式栈:

代码部分:

运行结果:


***闲话***

老规矩,书上干净完整代码,拿去用!

最近一直在忙感冒忙修电脑忙期中考试(          有点断更(

顺序栈里边两个栈共用一个存储空间的代码正在更新中  敬请期待

下面就是实现顺序栈和链式栈的代码,其实原理都差不多,甚至主函数都一样(

对小编个人而言更喜欢用链表a 不想判断顺序栈可恶的开始终止位置

然后虚拟数据类型我写了一个student,比较简单的数据类型嘞,方便大家看

其他的想到啥再补充啥  有问题或者我写的有不对的地方欢迎评论区指正!

**********

3.2.1顺序栈

代码部分:

#include <iostream>
using namespace std;
struct student
{int ID;string name;
};
ostream& operator<<(ostream& output, student& stu)
{output << stu.ID << " " << stu.name;return output;
}
const int stacksize = 1024;
template <class temp>
class seqstack
{
public:seqstack() { top = -1; }void push(temp x);temp pop();temp gettop();bool empty() { return top == -1 ? true : false; }//判断栈空时的条件:top==-1?
private:temp data[stacksize];int top;
};template<class temp>
void seqstack<temp>::push(temp x)
{if (this->top > stacksize - 1)throw"上溢";this->top++;this->data[this->top] = x;
}template <class temp>
temp seqstack<temp>::pop()
{if (empty())throw"下溢";this->top--;return this->data[this->top + 1];
}template<class temp>
temp seqstack<temp>::gettop()
{if (empty())throw"下溢";return this->data[this->top];
}
int main()
{try{system("color 0A");student x[5] = { {1,"zhang"},{2,"wang"},{3,"li"},{4,"zhao"},{5,"meng"} };seqstack<student> seq1;cout << "显示栈内是否为空?" << endl;cout << seq1.empty();cout << endl << endl;cout << "数据传输中……" << endl;for (int i = 0; i < 5; i++)seq1.push(x[i]);cout << "显示栈内是否为空?" << endl;cout << seq1.empty();cout << endl << endl;student stutemp;for (int i = 0; i < 5; i++){cout << "出栈元素的信息:" << endl;stutemp = seq1.pop();cout << stutemp;cout << endl;cout << "此时栈顶元素信息:" << endl;stutemp = seq1.gettop();cout << stutemp;cout << endl << endl;}cout << endl << "现在重新判断栈是否为空:" << endl;cout << seq1.empty();}catch (const char* a){cout << a << endl;}return 0;
}

运行结果:

遇到问题:

发现没有执行程序第79、80行

原因:catch到了const char*类型的异常,程序终止运行。

需要注意的是,一定要catch (const char*)!!!不要catch(string)否则你的程序跑不起来

我们把68行循环终止条件改成3

运行结果:

 

3.2.2链式栈:

代码部分:

#include <iostream>
using namespace std;
struct student
{int ID;string name;
};
ostream& operator<<(ostream& output, student& stu)
{output << stu.ID << " " << stu.name;return output;
}
template <class temp>
struct node
{temp data;node<temp>* next;
};template <class temp>
class linkstack
{
public:linkstack() { top = NULL; }~linkstack();void push(temp x);temp pop();temp gettop();bool empty(){return top == NULL ? true : false;}
private:node<temp>* top;
};template <class temp>
void linkstack<temp>::push(temp x)
{node<temp>* p = new node<temp>;p->data = x;p->next = this->top;this->top = p;
}template<class temp>
temp linkstack<temp>::pop()
{if (empty())throw "下溢";temp x = this->top->data;node<temp>* p = this->top;this->top = this->top->next;delete p;return x;
}template<class temp>
linkstack<temp>::~linkstack()
{while (this->top != NULL){node<temp>* p = this->top;this->top = this->top->next;delete p;}
}template<class temp>
temp linkstack<temp>::gettop()
{if (empty())throw"下溢";return this->top->data;
}
int main()
{try{system("color 0A");student x[5] = { {1,"zhang"},{2,"wang"},{3,"li"},{4,"zhao"},{5,"meng"} };linkstack<student> linklist1;cout << "显示栈是否为空?" << endl;cout << linklist1.empty();cout << endl << endl;cout << "数据传输中……" << endl;for (int i = 0; i < 5; i++)linklist1.push(x[i]);cout << "显示栈是否为空?" << endl;cout << linklist1.empty();cout << endl << endl;student stutemp;for (int i = 0; i < 5; i++){cout << "出栈元素信息:" << endl;stutemp = linklist1.pop();cout << stutemp;cout << endl;cout << "此时栈顶元素信息:" << endl;stutemp = linklist1.gettop();cout << stutemp;cout << endl << endl;}cout << "现在重新判断栈是否为空:" << endl;cout << linklist1.empty();}catch (const char*a){cout << a << endl;}return 0;
}

运行结果:

(将pop循环改成循环到3,同理,会显示最后一行“现在重新判断栈是否为:”) 

http://www.lryc.cn/news/44906.html

相关文章:

  • Vue3之使用js实现动画
  • 金三银四,你准备好面试了吗? (附30w字软件测试面试题总结)
  • 【C语言学习】数组
  • ElasticSearch序列 - SpringBoot整合ES:根据指定的 ids 查询
  • Spark SQL实战(08)-整合Hive
  • 堆(数据结构系列11)
  • 算法训练第四十二天|01背包问题 二维 、01背包问题 一维、416. 分割等和子集
  • Java-如何使用Java将图片和文字拼接在一起(并非是给图片加水印)
  • Metasploit入门到高级【第三章】
  • 枚举的使用
  • Python进阶语法
  • Pyspark_结构化流4
  • Linux cmp 命令
  • Python入门到高级【第五章】
  • C语言中(i++)+ (i++)真的每次都等于3吗?
  • Cursor,程序员的 AI 代码编辑助手
  • 基于XML的自动装配~
  • 完全二叉树的4种遍历方式
  • 【vue2】使用elementUI进行表单验证实操(附源码)
  • JUC之阻塞队列解读(BlockingQueue)
  • LCHub:ChatGPT4和低代码来临,程序员面临下岗?
  • 【Node.js】Express框架的基本使用
  • 使用docker 和 kubnernetes 部署单节点/多节点 kafka 环境
  • Linux使用:环境变量指南和CPU和GPU利用情况查看
  • 深入浅出 SSL/CA 证书及其相关证书文件(pem、crt、cer、key、csr)
  • Compose(1/N) - 概念 基本使用
  • 2023高质量Java面试题集锦:高级Java工程师面试八股汇总
  • MySQL多表查询 子查询效率(DQL语句)
  • Linux中 ps命令详解
  • 【Python语言基础】——Python 关键字