大话数据结构 栈与队列

栈是限定仅在表尾进行插入和删除操作的线性表。

我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。

栈的插入操作,叫作进栈,也称压栈、入栈。

栈的删除操作,叫作出栈,也有的叫作弹栈。

栈的抽象数据类型

ADT    栈(stack)
Data
        同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
        InitStack(*S):    初始化操作,建立一个空栈S。
        DestroyStack(*S):    若栈存在,则销毁它。
        ClearStack(*S):    将栈清空。
        StackEmpty(S):    若栈为空,返回True,否则返回False。
        GetTop(S,*e):    若栈存在且非空,用e返回S的栈顶元素。
        Push(*S,e):    若栈S存在,插入新元素e到栈S中并成为栈顶元素。
        Pop(*S,*e):    删除栈S中栈顶元素,并用e返回其值。
        StackLength(S):    返回栈S的元素个数。
endADT

栈的顺序存储结构:以首元素作为栈底。两栈共享空间可以提高空间利用率。

栈的链式存储结构:把栈顶放在单链表的头部,用栈顶作为头结点。

如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一点。

栈的应用——递归

我们把一个直接调用自己或通过一些列的调用语句间接地调用自己的函数,称为递归函数。

每个递归函数定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值输出。(避免无穷递归)

例子:斐波拉契数列。

栈的应用——四则运算表达式求值

1)将中缀表达式转化为后缀表达式(栈用来进出运算的符号);

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

2)将后缀表达式进行运算得出结果(栈用来进出运算的数字)。

规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

原文地址:https://www.cnblogs.com/didada/p/9634668.html

时间: 2024-11-21 03:04:30

大话数据结构 栈与队列的相关文章

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

C#数据结构—栈和队列

一:栈 栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制.栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以,把栈和队列称为操作受限的线性表. 1:栈的定义及基本运算 栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom).当栈中没有数据元素时叫

c数据结构 -- 栈与队列

栈和队列 ·栈和队列是两种常用的.重要的数据结构 ·栈和队列是限定插入和删除只能在表的“端点”进行的线性表 栈 只能在队尾插入,只能在队尾删除 -- 后进后出 表尾称为栈顶:表头称为栈底 插入元素到栈顶(即表尾)的操作,称为入栈 从栈顶删除最后一个元素的操作,称为出栈 注意:函数调用的流程就是入栈和出栈的实现,遵循后调用的先返回 队列 只能在队尾插入,只能在对队头删除 -- 先进先出 顺序栈的实现: #include <stdio.h> #include <stdlib.h> #d

数据结构-栈、队列和链表

一.栈stack 是后进先出的数据结构 栈顶指针指的始终是栈最上方元素的一个标记,即放在最上面的元素.栈顶元素为空时令top为-1. 在使用pop()函数和top()函数时,需要使用empty()判断栈是否为空. 在STL中stack容器来编写代码,STL定义stack的复杂度是O(1). 常见函数: clear() size() empty() push() pop() top() 二.队列queue 是一种先进先出的数据结构 需要一个队首指针front来指向队首元素的前一个位置,而使用一个队

数据结构-栈和队列

栈和队列都是线性表,所以满足-只有一个节点没有前继,只有后继,只有一个节点只有后继没有前继,其他的节点只有一个前继只有一个后继. 栈的定义是先进后出,最典型的例子就是弹夹,最先进去的反而是最后射出来的,在实际的软件开发中会进经常的遇到这种类型的线性表,我们成为LIFO(Last in First out).可以把栈想象成是只有一个出口的容器,最先放进去的东西只能够等其上面的东西呗拿走之后才能够拿出来. 队列则是另外的一种线性表,队列在我们生活中就更常见了,比如排队啊什么的,队列讲的是先进先出,在

大话数据结构----栈

栈的定义: 栈(stack)是限定尽在表尾进行插入和删除操作的线性表. 从定义中可以看出,栈也是线性表,是一个特殊的线性表,之前说线性的表的时候,线性表可以在任意位置进行插入插入,而栈比线性表特殊的地方的就是不能随意的插入和删除了,栈的插入和删除只能在规定的同一端进行,而被允许插入和删除的一端称为栈顶,另一端称为栈底. 从栈的特性中我们能发现:1).栈是一种后进先出的线性表,因为栈只有一个出入口,每次出栈是最后进的那个先出去,后一个才能出去,就像我们出电梯一样,里面的人被阻住,只有外面的人出去,

数据结构-栈与队列

相比于数组这种存储数据的数据,栈(Stock)和队列(Queue)主要作用是在程序中作为构思算法的辅助工具,是一种程序员开发过程中的便利工具.Stock和Queue具有访问受限以及更加抽象的特征. 一.栈 栈只允许访问最后一个插入的元素,即栈是先进后出(FILO)的一种数据结构.栈主要提供的算法包括push,pop和peek.其中push是插入一个元素,pop是弹出最近添加的一个元素,peek是返回最近添加的一个元素. 栈的底层实现可以是数组,也可以是链表,这里采用数组实现一个栈,代码如下: 1

JavaScript数据结构——栈和队列

栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 ------------------------------------------------------------------------------------------------------ 栈方法声明: 首先,采用数组来保存栈里的元素. 序号 方法 说明 1 push ( element(s) ) 添加一个(或几个)新元素到栈顶 2 pop ( ) 移除栈顶的元素,同时返回被移除的元素 3 peek ( )