数据结构复习--栈和队列(1)--栈

1.栈和队列简介:

栈和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表,栈和队列这三种数据元素和数据元素间的逻辑完全相同。差别是线性表的操作不受限制,而栈和队列的操作收到限制,栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以把栈和队列称为操作受限的线性表

栈:

栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入,删除等操作,所以,它具有特殊含义,把表尾成为栈顶(Top),另一端是固定的,叫栈底(Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。

栈通常记为S=(a1,a2,......an),a1为栈底元素,an为栈订元素,这n个数据元素按照a1,a2,......an的顺序依次入栈,而出栈的顺序相反,an第一个出栈,a1最后一个出栈。所以,栈的操作是按照后进先出(Last In First Out)或先进后出(First In Last Out)。栈操作示意图:

C#2.0中提供了泛型的Stack<T>类,用来进行栈的操作。

常用方法:

1.Push()  入栈,添加数据

2.Pop()  出栈,删除数据并返回被删除的数据

3.Peek()取得栈订的数据,不删除

4.Clear()清空所有的数据

4.Count 取得栈中数据的个数

2.顺序栈:

用一片连续的存储空间来存储栈中的数据元素,这样的栈成为顺序栈<Sequence Stack>,类似于顺序表,用以为数组来存放栈中的数据元素。栈顶指示器top设在数组下标为0的一端,top随插入和删除而变化,当栈顶为空时,top=-1 示意图:

 c#实现顺序栈:

 public class SeqStack<T> : IStackDS<T>
    {
        /// <summary>
        /// 存放元素
        /// </summary>
        private T[] Data;
        /// <summary>
        /// 指向栈顶索引
        /// </summary>
        private int top;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="size">长度</param>
        public SeqStack(int size)
        {
            Data = new T[size];
            top = -1;
        }
        /// <summary>
        /// 默认构造函数
        /// </summary>
        public SeqStack() : this(10)
        {

        }
        /// <summary>
        /// 获取元素数量
        /// </summary>
        public int Count { get { return top + 1; } }
        /// <summary>
        /// 清空
        /// </summary>
        public void Clear()
        {
            top = -1;
        }
        /// <summary>
        /// 获取长度
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return Count;
        }
        /// <summary>
        /// 是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return Count == 0;
        }
        /// <summary>
        /// 获取栈顶元素
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            return Data[top];
        }
        /// <summary>
        /// 出栈
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            T temp = Data[top];
            top--;
            return temp;
        }
        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="item"></param>
        public void Push(T item)
        {
            Data[top + 1] = item;
            top++;
        }
    }

3.链栈:

栈的另外一种存储方式是链式存储,这样的栈成为链栈(Linked Stack)。链栈通常用单链表来表示,它的实现是单链表的简化。所以链栈的结点结构与单链表一样。由于链栈的操作只在一端进行,为了操作方便,把栈顶设在链表的头部,并且不需要头结点。

c#实现链栈:

 class LinkStack<T> : IStackDS<T>
    {
        /// <summary>
        /// 栈顶元素结点
        /// </summary>
        private Node<T> top;
        /// <summary>
        /// 栈中元素个数
        /// </summary>
        private int count = 0;
        /// <summary>
        /// 取得栈中元素个数
        /// </summary>
        public int Count { get { return count; } }
        /// <summary>
        /// 清空栈中数据
        /// </summary>
        public void Clear()
        {
            count = 0;
            top = null;
        }
        /// <summary>
        /// 取得栈中元素个数
        /// </summary>
        /// <returns></returns>
        public int GetLength() => count;
        /// <summary>
        /// 是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty() => count == 0;

        /// <summary>
        /// 取得栈顶元素数据 不删除栈顶
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            return top.Data;
        }
        /// <summary>
        /// 出栈
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            //取得栈顶元素,删除
            T data = top.Data;
            top = top.Next;
            count--;
            return data;
        }
        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="item"></param>
        public void Push(T item)
        {
            //把新添加的元素作为栈顶
            Node<T> newNode = new Node<T>(item);
            newNode.Next = top;
            top = newNode;
            count++;
        }
    }

 结点类:

public class Node<T>
    {
        /// <summary>
        /// 存放数据
        /// </summary>
        private T data;
        /// <summary>
        /// 下一个结点
        /// </summary>
        private Node<T> next;

        #region 构造函数
        public Node()
        {
            data = default(T);
            next = null;
        }
        public Node(T data)
        {
            this.data = data;
            next = null;
        }
        public Node(T _data,Node<T> _next)
        {
            data = _data;
            next = _next;
        }
        public Node(Node<T> _next)
        {
            data = default(T);
            next = _next;
        }
        #endregion

        public T Data { get => data; set => data = value; }
        public Node<T> Next { get => next; set => next = value; }
    }

原文地址:https://www.cnblogs.com/quebra/p/10247315.html

时间: 2024-10-06 16:15:31

数据结构复习--栈和队列(1)--栈的相关文章

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

【栈和队列】栈和队列的基本应用(C++版)

栈和队列的应用非常之广,只要问题满足后进先出和先进先出原则,均可使用栈和队列作为其数据结构. (注意:在下面的代码中,我直接使用C++标准库提供的模板stack和queue,如果您用C语言,则要用前面介绍的方法自己实现stack和queue) 栈的应用 数制转换: 将一个非负的十进制整数N转换为另一个等价的基为B的B进制数的问题,很容易通过"除B取余法"来解决. [例]将十进制数13转化为二进制数. 解答:按除2取余法,得到的余数依次是1.0.1.1,则十进制数转化为二进制数为1101

《大话数据结构》笔记(4-1)--栈与队列:栈

栈的Java实现代码: https://github.com/Lyu0709/data-structure/blob/master/src/com/coding/basic/stack/Stack.java 逆波兰算法实现: https://github.com/Lyu0709/data-structure/blob/master/src/com/coding/basic/stack/RPN.java 第四章  栈与队列 栈 定义 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(b

数据结构与算法之队列、栈

除了数组.链表,线性的数据结构中还有很重要的几种结构:队列.栈. 队列,一种先进先出的数据结构(FIFO),其实队列可以看成是一个两个口的管道,从一个口进,另一个口出,先进去的必定得在另一个口先出去,否则后面的都出不去:栈,一种后进先出的数据结构(LIFO),栈更像是只有一个口的管道,只有一个开口可以进出,先进去的在底部,所以必须得让后进去的先出去,它才能出去. 实现队列和栈可以用顺序存储结构,也可以用链式存储结构.这里采用的是链表来实现,同时还有用两个栈实现一个队列和用两个队列实现一个栈的算法

java:数据结构复习(二)数组栈

栈也是数据结构中重要数据结构,它分为链栈和数组栈,特性:元素先进后出,后进先出 读取也只能读取栈顶元素,栈的应用有以下几种:括号匹配,进制转换,与递归也有关系,判断回文,表达式计算(我会在以后文章专门写几篇介绍应用) 推荐在书写数据结构时,保留一个主函数进行测试 栈的源代码: import java.util.Arrays; import java.util.Scanner; /** * @author 李正阳 */ public class MyArraysStack<E> implemen

数据结构(背包、队列和栈)

一.背包 背包是一种不支持从中删除元素的集合数据类型,目的是帮助用例收集元素并迭代所有收集到的元素,也可以检查背包是否为空,或者获取背包中元素的数量.背包里面的元素的顺序不确定. 要理解背包的概念,可以想象一个喜欢收集弹珠球的人.他将所有的弹珠球都放在一个背包里,一次一个,并且会不时在所有的弹珠球中寻找某一颗: 1.用链表实现 import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; import jav

LeetCode225 栈&#183;用队列实现栈(C++)

题目描述: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的. 你所使用的语言也许不支持队列. 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可. 你可以假设所有操作都

3.1_栈和队列_栈

[栈的定义] 栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 栈又称为后进先出(Last In First Out)线性表,简称LIFO结构. (PS:定义中的表尾是指 栈顶!) [几个关键词 ] [ 栈顶(top) ] 允许插入和删除的一端称为 栈顶. [ 栈底(bottom) ] 栈顶的另一端称为 栈底. [ 空栈 ] 不含任何数据元素的栈. [栈的插入操作——进栈(push)] 栈的插入操作,叫做进栈,也称为压栈.入栈. [栈的删除操作——出栈(pop)] 栈的删除操作,叫做出

算法习题---栈与队列之栈的数学性质

一:栈的数学性质 当n个编号元素以某种顺序进栈,并且可以在任意时刻出栈,所获得的编号元素排列的数目N恰好满足Catalan函数的计算,即 二:题目一: 试着将1,2,3,4,5,6,六个数字入栈,则出栈方式有几种?使用数学性质可以知道有132种 三:其他题目:判断栈给定的操作序列的合法性 I入栈O出栈,例如ABC入栈,出栈为CBA,那么给定序列为IIIOOO,表示3个先入栈,然后出栈 现在给定一个序列(只含IO)要求判断其是否合法 四:性质 1.IO个数一致 2.开始到中间任一位置I的数目大于O