堆栈(Stack)

参考浙大版《数据结构(第2版)》

  • 堆栈可以认为是具有一定约束的线性表,插入和删除的操作都在栈顶的位置,先进入的元素将在后进入的元素之后取出,与生活中的桶类似,故又称为后入先出(Last In First Out, LIFO)表。

非STL的堆栈实现:

  • 手写的堆栈主要有以下几种基本操作:
  • Stack CreateStack(int MaxSize):生成空堆栈,其最大长度为MaxSize;
  • bool IsFull(Stack S):判断堆栈S是否已满。若S中的元素个数等于MaxSize则返回true,否则返回false;
  • bool Push(Stack S, ElememtType X):将元素X压入堆栈。若堆栈已满,返回false;否则将元素X插入到堆栈S栈顶处并返回true;
  • bool IsEmpty(Stack S):判断堆栈S是否为空,若是返回true;否则返回false;
  • ElementType Pop(Stack S):删除并返回栈顶元素,若堆栈为空则返回错误信息;

堆栈的顺序储存实现

  • 顺序栈类型定义如下(以整数为例):
typedef int ElementType;
typedef int Position;
typedef struct SNode * Stack;
struct SNode
{
ElementType * Date;
Position Top;
int MaxSize;
};
  • 顺序栈以上操作的代码实现:
//生成空堆栈
Stack CreateStack(int MaxSize)
{
Stack S = (Stack)malloc(sizeof(struct SNode));
S ->Date = (ElementType *)malloc(MaxSize * sizeof(ElementType));
S ->Top = -1;
S ->MaxSize = MaxSize;
return S;
}
//判断堆栈是否已满
bool IsFull(Stack S)
{
return (S ->Top == S ->MaxSize);
}
//圧栈操作
bool Push(Stack S, ElementType x)
{
if(IsFull(S)) return 0;
else
{
S ->Date[++(S ->Top)] = x;
return 1;
}
}
//判断堆栈是否为空
bool IsEmpty(Stack S)
{
return (S ->Top == -1);
}
//弹出栈操作
ElementType Pop(Stack S)
{
if(IsEmpty(S)) return ERROR;
else
{
return (S ->Date[(S ->Top)--]);
}
}

堆栈的链式存储实现

  • 堆栈的链式存储由链表实现,因此不存在堆栈大小的问题,故没有判断栈满的操作;
  • 链式栈的类型声明:
typedef int ElementType;
typedef struct SNode * Stack;
struct SNode
{
ElementType Data;
Stack Next;
};
  • 基本操作的代码实现:
//生成空堆栈
Stack CreateStack(Stack S)
{
S = (Stack)malloc(sizeof(struct SNode));
S ->Next =NULL;
return S;
}
//圧栈操作
void Push(Stack S, ElementType X)
{
Stack t = (Stack)malloc(sizeof(struct SNode));
t ->Data = X;
t ->Next = S ->Next;
S ->Next = t;
}
//判断栈是否为空
bool IsEmpty(Stack S)
{
return (S ->Next == NULL);
}
//弹出栈
ElementType Pop(Stack S)
{
if(IsEmpty(S))
{
return ERROR;
}
else
{
Stack TopElem = S ->Next;
int Top = TopElem ->Data;
S ->Next = TopElem ->Next;
free(TopElem);//注意要及时释放内存
return Top;
}
}

STL中的堆栈

在C++的STL中自带堆栈,一般情况下使用STL较多

  • 头文件:
#include <stack>
  • 基本操作:
  • stacks; //生成空堆栈
  • s.empty() //若堆栈为空则返回真,否则返回假
  • s.pop() //移除栈顶元素
  • s.push(item) //在栈顶增加元素item
  • s.size() //返回栈中元素数目
  • s.top() //返回栈顶元素

未完待续……

【数据结构】【C++】堆栈的实现与应用的更多相关文章

  1. python数据结构之堆栈

    本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记 堆栈(Stack) 一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行. 堆栈可以通过数组和链表轻松实现 一 ...

  2. 数据结构之堆栈C++版

    /* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 ...

  3. Python 数据结构_堆栈

    目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...

  4. NYOJ-2 括号配对问题 -- 数据结构_堆栈

    以前做过的,现在整理一下,主要是堆栈的使用 1.碰到左括号就入栈,碰到右括号就从栈里弹出一个和当前比配,匹配失败就肯定是NO了; 2.如果右括号弹栈的时候栈空,则说明之前没有和右括号匹配的左括号了,这 ...

  5. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

  6. 数据结构之堆栈java版

    import java.lang.reflect.Array; /* 具体原理在c++版已经说的很清楚,这里不再赘述, 就提一点:java的泛型具有边界效应,一旦离开作用域立马被替换为object类型 ...

  7. 使用LinkedList模拟一个堆栈或者队列数据结构

    使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public cl ...

  8. java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

    /* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import jav ...

  9. Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。

    package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...

  10. 面试题:使用LinkedList来模拟一个堆栈或者队列数据结构

    请使用LinkedList来模拟一个堆栈或者队列数据结构. 堆栈:先进后出 First In Last Out  (FILO) 队列:先进先出 First In First Out  (FIFO) 我 ...

随机推荐

  1. Java Web Servlet知识点讲解(二)

    一.定义Servlet: public class HelloServlet extends HttpServlet { @Override  protected void doGet(HttpSer ...

  2. 后端跨域的N种方法

    简单来说,CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Co ...

  3. Oracle查询如何才能行转列?-sunziren

    原创文章,转载务必注明出处. 今天工作的时候,碰到一个问题,涉及oracle行转列,用了半小时解决,因此在这里写个博客记录一下解决办法. 原数据库表的数据是: 想要达到的效果是: 经过思考,这是一个o ...

  4. PHP操作mysql(mysqli + PDO)

    [Mysqli面向对象方式操作数据库] 添加.修改.删除数据 $mysqli ','test'); $mysqli->query('set names utf8'); //添加数据 $resul ...

  5. Spring Boot源码(八):Spring AOP源码

    关于spring aop的应用参见:Spring AOP-基于@AspectJ风格 spring在初始化容器时就会生成代理对象: 关于创建bean的源码参见:Spring Boot源码(六):Bean ...

  6. selenium实现网易邮箱的登录注册

    #实现163网站的注册 from selenium import webdriver import time driver = webdriver.Chrome() url = 'https://ma ...

  7. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  8. [大数据技术]Kettle从CSV文件读取清洗后到MySQL中文乱码问题

    首先要知道CSV文件的编码格式 然后在文件输入编码选择编码格式, 第二步,在每个转换或者作业的DB连接中选择选项,并添加如下内容: 中文乱码问题得到解决

  9. 数据库MySQL中关于“多表关联更新”的那些事

    在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...

  10. Json与Ajax(注册实例)

    需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...