栈的简介与C++模板实现
来源:互联网 发布:菜鸟网络农村物流加盟 编辑:程序博客网 时间:2024/04/29 21:29
何为栈?
栈(Stack)是一种线性存储结构,它具有如下特点:
栈中的数据元素遵守“先进后出”(First In Last Out)的原则,简称FILO结构。限定只能在栈顶进行插入和删除操作。
栈的相关概念与操作
1.栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
2.压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
3.弹栈:栈的删除操作,也叫做出栈。
4.求栈的大小
5.求栈顶元素的值
6.判断栈是否为空
ps:压栈的过程中,栈顶为位置一直在向上移动,而栈底是固定不变的。
类似,弹栈的过程中,栈顶为位置一直在向上移动,而栈底是固定不变的。
栈是一种线性结构,能以数组或链表作为底层数据结构来实现。
基于数组的栈实现
通常以数组头为栈底,数组尾为栈顶。
/*栈的抽象数据类型*/template <typename T>class ArrayStack{public: //初始化,指定模拟栈的容量 和 目前大小 ArrayStack(int s,int a=0):maxsize(s),count(a) {} //~ArrayStack();public: T top(); //获取栈顶元素 void push(T a); //压栈 T pop(); //弹栈 bool isEmpty(); //判断是否为空 int size(); //栈的大小private: int count; //栈的元素数量 int maxsize; //栈的容量 T array[10]; //底层数据结构为数组};
具体实现
template <typename T>bool ArrayStack<T>::isEmpty() //栈的判空{ return count==0; };template <typename T>int ArrayStack<T>::size() //栈的大小{ return count;};template <typename T>void ArrayStack<T>::push(T a) //压栈{ if(count != maxsize) array[count++] = a;};template <typename T>T ArrayStack<T>::pop() //弹栈{ if(count != 0) return array[--count];};template <typename T>T ArrayStack<T>::top() //获取栈顶元素{ if(count != 0) return array[count-1];};
主函数
int main(){ ArrayStack<int> p(5); for(int i=0; i<5; i++) p.push(i); cout << "栈的大小为:" << p.size() << endl; cout << "栈顶元素:" << p.top() << endl; cout << "依次出栈: " << endl; while(!p.isEmpty()) { cout << p.pop() << endl; } return 0;}
输出结果:
栈的大小为:5栈顶元素:4依次出栈: 43210
本例中指定栈的大小后就不支持扩容,栈满后就无法再进行压栈操作。
基于链表的栈实现
以链表头作为栈顶,方便结点的删除和插入,压栈后的新结点将一直出现在链表的头部。如下图所示,很清晰直观,不再啰嗦。
链表结点
/*链表结点,即栈中的元素*/template <typename T>struct Node{ Node(T t):value(t),next(NULL) {} Node():next(NULL){}public: T value; //结点元素的值 Node<T>* next; //链表结点指针};
栈的抽象数据类型
/*基于链表的栈的ADT*/template <typename T>class LinkStack{public: //构造函数 LinkStack(int icount=0):count(icount) {} //几种操作 bool isEmpty(); int size(); void push(T t); T pop(); T top();private: Node<T>* phead; //头指针 int count; //栈中元素的数量};
具体实现
/*返回栈的大小*/template <typename T>int LinkStack<T>::size(){ return count;};template <typename T>bool LinkStack<T>::isEmpty(){ return count==0;};template <typename T>void LinkStack<T>::push(T t){ Node<T> *pnode = new Node<T>(t); pnode -> next = phead -> next; phead -> next = pnode; count++;};template <typename T>T LinkStack<T>::pop(){ if(phead-> next != NULL) { Node<T>* pdel = phead -> next; phead -> next = pdel -> next; T value = pdel -> value; delete pdel; count--; return value; }};template <typename T>T LinkStack<T>::top(){ if(phead -> next != NULL) return phead -> next -> value;};
上面具体操作的实现和基于数组的相似~
主函数实例
int main(){ LinkStack <string> lstack; lstack.push("!!!"); lstack.push("linux"); lstack.push("hello"); cout << "栈的大小:" << lstack.size() << endl; cout << "栈顶元素: " << lstack.top() << endl; cout << "栈元素:" << endl; while(!lstack.isEmpty()) { cout << lstack.pop() << endl; } cout << "栈的大小:" << lstack.size() << endl; return 0;}
本文简单的介绍了一下栈的相关概念,主要是用C++模板实现基于数组和链表的栈,希望对大家有所帮助。
1 0
- 栈的简介与C++模板实现
- 队列的简介与C++模板实现
- 栈的简介及C++模板实现
- [c++]栈模板的实现
- C++:栈(stack)的模板类实现
- [C++]模板类的声明与实现分离问题
- Base64算法的简介与C语言实现
- C++中模板与用C语言中实现模板
- 二维码的简介与实现
- c语言模拟实现栈的模板化
- [数据结构]栈的实现(c++/类模板)
- 大顶堆的C++模板实现及二叉堆的简介
- 栈模板的实现
- ASP.NET的模板实现(c#)
- ASP.NET的模板实现(c#)
- C++primer 实现queue的模板类
- ASP.NET的模板实现(c#)
- [C++] 利用模板的模板参数实现单链表
- cmd
- 8天学通MongoDB——第二天 细说增删查改
- datepicker 季度
- Aizu - NTL_1_C Least Common Multiple
- Sigslot介绍
- 栈的简介与C++模板实现
- RabbitMQ 实战教程(三) 发布/订阅
- Kafka入门:主要配置以及集群搭建
- poj3522(求最大边最小边差值最小的生成树)
- js局部变量与全局变量的
- 深度学习(四十)caffe使用点滴记录
- 【BZOJ2655】calc,dp+拉格朗日插值法
- makefile中目标all与phony用法
- Unknown character set: 'utf8mb4'