博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
栈的简介与C++模板实现
阅读量:4184 次
发布时间:2019-05-26

本文共 3173 字,大约阅读时间需要 10 分钟。

何为栈?

栈(Stack)是一种线性存储结构,它具有如下特点:

栈中的数据元素遵守“先进后出”(First In Last Out)的原则,简称FILO结构。限定只能在栈顶进行插入和删除操作。

栈的相关概念与操作

1.栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。

2.压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
3.弹栈:栈的删除操作,也叫做出栈。
4.求栈的大小
5.求栈顶元素的值
6.判断栈是否为空

ps:压栈的过程中,栈顶为位置一直在向上移动,而栈底是固定不变的。

类似,弹栈的过程中,栈顶为位置一直在向上移动,而栈底是固定不变的。


栈是一种线性结构,能以数组或链表作为底层数据结构来实现。

基于数组的栈实现

通常以数组头为栈底,数组尾为栈顶。
/*栈的抽象数据类型*/template 
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 
bool ArrayStack
::isEmpty() //栈的判空{ return count==0; };template
int ArrayStack
::size() //栈的大小{ return count;};template
void ArrayStack
::push(T a) //压栈{ if(count != maxsize) array[count++] = a;};template
T ArrayStack
::pop() //弹栈{ if(count != 0) return array[--count];};template
T ArrayStack
::top() //获取栈顶元素{ if(count != 0) return array[count-1];};

主函数

int main(){    ArrayStack
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 
struct Node{ Node(T t):value(t),next(NULL) {} Node():next(NULL){}public: T value; //结点元素的值 Node
* next; //链表结点指针};

栈的抽象数据类型

/*基于链表的栈的ADT*/template 
class LinkStack{
public: //构造函数 LinkStack(int icount=0):count(icount) {} //几种操作 bool isEmpty(); int size(); void push(T t); T pop(); T top();private: Node
* phead; //头指针 int count; //栈中元素的数量};

具体实现

/*返回栈的大小*/template 
int LinkStack
::size(){ return count;};template
bool LinkStack
::isEmpty(){ return count==0;};template
void LinkStack
::push(T t){ Node
*pnode = new Node
(t); pnode -> next = phead -> next; phead -> next = pnode; count++;};template
T LinkStack
::pop(){ if(phead-> next != NULL) { Node
* pdel = phead -> next; phead -> next = pdel -> next; T value = pdel -> value; delete pdel; count--; return value; }};template
T LinkStack
::top(){ if(phead -> next != NULL) return phead -> next -> value;};
上面具体操作的实现和基于数组的相似~

主函数实例

int main(){    LinkStack 
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++模板实现基于数组和链表的栈,希望对大家有所帮助。

转载地址:http://fluoi.baihongyu.com/

你可能感兴趣的文章
openstack-instance-high-availability-Evacuate
查看>>
evacuate-instance-automatically
查看>>
pycharm常用设置(keymap设置及eclipse常用快捷键总结)
查看>>
关于在openstack的环境变量.bashrc自定自己简化命令
查看>>
Openstack Heat Project介绍(转)
查看>>
How to Perform an Upgrade from Icehouse to Juno(ice升级到juno)
查看>>
高扩展性网站的50条原则(转)-思维导图
查看>>
解决openstack novnc一段时间后自动挂断登录不上问题,novncproxy dead but pid file exists
查看>>
构建OpenStack的云基础架构:ManageIQ(转)
查看>>
云管理软件 ManageIQ(转)
查看>>
CentOS 7.0,启用iptables防火墙(转)
查看>>
svn忽略ignore文件记住方式(转)
查看>>
web缓存相关知识(转)
查看>>
Understanding Spring MVC Model and Session Attributes
查看>>
Spring MVC中Session的正确用法之我见(转)
查看>>
Spring2.5 访问 Session 属性的四种策略
查看>>
Spring MVC 3.0 深入及对注解的详细讲解(转)
查看>>
ModelMap和ModelAndView的作用(转)
查看>>
DISCUZ浅析之COOKIE篇
查看>>
实战DDD(Domain-Driven Design领域驱动设计:Evans DDD)
查看>>