数据结构--顺序栈和链式栈
http://www.cnblogs.com/jingliming/p/4602458.html
栈是一种限定只在表尾进行插入或删除操作,栈也是线性表表头称为栈的底部,表尾称为栈的顶部,表为空称为空栈,栈又称为后进先出的线性表,栈也有两种表示:顺序栈与链式栈顺序栈是利用一组地址连续的存储单元,依次存放从栈底到栈顶的数据元素,附设一个指针指示栈顶的元素在栈中的位置。
1 //顺序栈的实现 2 #define INFINITY 65535 3 #define MAXSIZE 1000 4 #define ElemType int 5 6 typedef struct { 7 ElemType data[MAXSIZE]; //栈的大小 8 int top; //栈顶的游标 9 }Stack; 10 11 class ArraryStack{ 12 public: 13 void initStack(Stack *s); //初始化栈 14 15 bool isEmpty(Stack *s); //判断栈是否为空 16 17 ElemType Top(Stack *s); //返回栈顶的元素 18 19 ElemType Pop(Stack *s); //返回并删除栈顶的元素 20 21 void Push(Stack *s,ElemType e); //将元素e压栈 22 23 void Print(Stack *s); //输出从栈底到栈顶的元素 24 25 void Clear(Stack *s); //清空栈元素 26 27 }; 28 29 void ArraryStack::initStack(Stack *s) 30 { 31 s->top=-1; 32 } 33 34 bool ArraryStack::isEmpty(Stack *s) 35 { 36 if (s->top==-1) 37 { 38 return true; 39 } 40 return false; 41 } 42 43 ElemType ArraryStack::Top(Stack *s) 44 { 45 if (!isEmpty(s)) 46 { 47 return s->data[s->top]; 48 } 49 return INFINITY; 50 } 51 52 ElemType ArraryStack::Pop(Stack *s) 53 { 54 if (!isEmpty(s)) 55 { 56 return s->data[s->top--]; 57 } 58 return INFINITY; 59 } 60 61 void ArraryStack::Push(Stack *s,ElemType e) 62 { 63 if(s->top>=MAXSIZE-1) 64 return; 65 ++s->top; 66 s->data[s->top]=e; 67 68 } 69 70 void ArraryStack::Print(Stack *s) 71 { 72 for (int i=0;i<=s->top;i++) 73 { 74 printf("%d ",s->data[i]); 75 } 76 printf("\n"); 77 } 78 79 void ArraryStack::Clear(Stack *s) 80 { 81 s->top=-1; 82 }
第二部分:链式栈的实现
1 //链式栈的声明 2 template<typename T> 3 struct LinkNode{ 4 5 LinkNode* next; 6 T data; 7 }; 8 9 //链式栈的实现 10 template<typename T> 11 class LinkStack 12 { 13 public: 14 LinkStack(); 15 ~LinkStack(); 16 void Push(T value); 17 T Pop(); 18 T Top(); 19 int Size(); 20 bool isEmpty(); 21 22 private: 23 LinkNode<T> *pHead; 24 }; 25 26 template<typename T> 27 LinkStack<T>::LinkStack() 28 { 29 30 pHead=new LinkNode<T>; 31 if(pHead==NULL) 32 cout<<"构建头结点空间失败。"<<endl; 33 else 34 { 35 pHead->next=NULL; 36 pHead->data=NULL; 37 } 38 } 39 40 template<typename T> 41 LinkStack<T>::~LinkStack() 42 { 43 44 } 45 46 template<typename T> 47 void LinkStack<T>::Push(T value) 48 { 49 LinkNode<T> *p=new LinkNode<T>; 50 p->data=value; 51 p->next=pHead->next; 52 pHead->next=p; 53 } 54 55 template<typename T> 56 T LinkStack<T>::Pop() 57 { 58 T value; 59 LinkNode<T> *p=pHead->next; 60 if (p!=NULL) 61 { 62 value= p->data; 63 pHead->next=p->next; 64 delete p; 65 p=NULL; 66 return value; 67 } 68 else 69 { 70 71 cout<<"没有结点"<<endl; 72 return NULL; 73 } 74 75 } 76 77 template<typename T> 78 T LinkStack<T>::Top() 79 { 80 LinkNode<T> *p=pHead->next; 81 if (p!=NULL) 82 { 83 T value=p->data; 84 return value; 85 } 86 else 87 { 88 89 cout<<"头结点为空。"<<endl; 90 return NULL; 91 } 92 } 93 94 template<typename T> 95 int LinkStack<T>::Size() 96 { 97 int count=0; 98 LinkNode<T> *p=pHead->next; 99 while(p!=NULL) 100 { 101 102 ++count; 103 p=p->next; 104 } 105 return count; 106 } 107 108 template<typename T> 109 bool LinkStack<T>::isEmpty() 110 { 111 LinkNode<T> *p=pHead->next; 112 if (p==NULL) 113 { 114 return true; 115 } 116 return false; 117 }
测试用例:
1 int main() 2 { 3 LinkStack<int> sta; 4 sta.Push(1); 5 sta.Push(2); 6 sta.Push(3); 7 cout << "The size of the stack now is " << sta.Size() << endl; 8 sta.Pop(); 9 cout << "The top element is " << sta.Top() << endl; 10 cout << "The size of the stack now is" << sta.Size() << endl; 11 if (sta.isEmpty()) 12 { 13 cout << "This stack is empty." << endl; 14 } 15 else 16 { 17 cout << "This stack is not empty." << endl; 18 } 19 system("pause"); 20 return 0; 21 }
数据结构--顺序栈和链式栈相关推荐
- 数据结构——顺序栈和链式栈的简单实现和解析(C语言版)
摘自:数据结构学习--顺序栈和链式栈的简单实现和解析(C语言版) 作者:正弦定理 发布时间:2020-11-26 21:26:49 网址:https://blog.csdn.net/chineseko ...
- 数据结构 :: 顺序栈与链式栈的设计与实现
数据结构 :: 双链表的设计与实现 说明:本文属于读书笔记.笔者将以讲述的方式表达全片文章.故文中提到的某些字词是非正式术语,只是笔者本人的理解性词语. 前言:本文将对顺序栈与链式栈进行设计与实现!其 ...
- 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...
- java顺序栈和链栈_Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- 【数据结构】栈-顺序栈、链式栈、共享栈
栈的定义 栈(Stack):只允许在一端进行插入或删除操作的线性表 栈顶(Top):线性表允许进行插入和删除的那一端. 栈底(Bottom):固定的,不允许进行插入和删除的另一端. Tips: 1.栈 ...
- 【数据结构与算法】栈的基本运算(出栈、入栈、销毁栈等)及源码(顺序栈和链式栈)
一.顺序栈 .h文件 #include <iostream> using namespace std;#define STACKSIZE 100 typedef int DataType; ...
- 数据结构-顺序栈、链栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- C语言 数据结构 顺序栈的实现 进栈 出栈 初始化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.代码实现 前言 顺序栈是栈的顺序实现.顺序栈是指利用顺序存储结构实现的栈.采用地址连续的存储空间(数组)依次存储栈 ...
- 天勤考研数据结构———顺序栈、链栈操作
typedef struct{ //定义顺序栈 int data[maxsize]; int top;//定义栈顶指针 }SqStack; void in ...
最新文章
- 遍历百万级Redis的键值的续集
- uboot---linux
- 对于python 3.x与python2.x中新型类的继承特性总结
- qgis在地图上画导航线_在Laravel中的航线
- 虚拟机开启mysql服务_远程操作虚拟机中的mysql服务器
- 工具-管理工具资源集合
- ajax中GET和POST区别
- c语言中sys是什么文件夹,windows系统中C盘的pagefile.sys是什么文件
- 云数据库PostgreSQL新人怎样上手
- w7计算机管理哪个是显卡,win7怎么看显卡配置以及win7怎么看电脑完整配置
- 机器学习scikit-learn(一)(转)
- 通过虚拟驱动vivi分析摄像头驱动
- win 10 桌面突然多了一个IE图标无法上删掉,怎么办?
- 数字数据转换为字符数据_为什么替代数据对数字转换至关重要
- SSD: Single Shot MultiBox Detector 论文翻译
- eclipse资源管理器直接打开文件目录方法
- Silverlight技术是什么
- 大数据安全运营内容包括哪些?
- archlinux什么桌面好_浅谈Linux桌面(发行版及桌面环境)
- Web前端学习之Web设计与Web开发
热门文章
- Mysql数据库安全管理配置
- display:none;与visibility:hidden;的区别
- -bash: belts.awk: command not found
- JAVA多线程学习3--线程一些方法
- [转载]FPGA/CPLD重要设计思想及工程应用(时序及同步设计)
- Oracle中用For Loop 替代Cursor
- html5储存类型特点,避免踩雷!你不得不知的 HTML5 “新”特性
- java gson fromjson,Gson的fromJson()方法
- win8.1 计算机 桌面快捷方式,win8.1操作系统中我的电脑在哪里?win8.1我的电脑快捷键添加方法介绍...
- 乐高无限的服务器怎么建,乐高无限悬空房子怎么建造 建造方法介绍