• 栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往上堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。

    栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。

         一个栈可以用定长为N的数组S来表示,用一个栈指针TOP指向栈顶。若TOP0,表示栈空,TOP=N时栈满。进栈时TOP加1。退栈时TOP减1。当TOP<0时为下溢。栈指针在运算中永远指向栈顶。

    1、进栈(PUSH)算法

    ①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);

    TOP++(栈指针加1,指向进栈地址);

    S[TOP]=X,结束(X为新进栈的元素);

    2、退栈(POP)算法

    ①若TOP0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②)
      X=S[TOP],(退栈后的元素赋给X);
      TOP--,结束(栈指针减1,指向栈顶)。

    进栈、出栈的c++实现过程程序:

    #define n 100

    void push(int s[],int *top,int *x)  //入栈

    {

       if (*top==n) printf("overflow");

         else { (*top)++; s[*top]=*x; }

    }

    void pop(int s[],int *y,int *top)   //出栈

    {

       if (*top==0)  printf("underflow");  

         else { *y=s[*top]; (*top)--; }

    }

    对于出栈运算中的“下溢”,程序中仅给出了一个标志信息,而在实际应用中,下溢可用来作为控制程序转移的判断标志,是十分有用的。对于入栈运算中的“上溢”,则是一种致命的错误,将使程序无法继续运行,所以要设法避免。

    总结

    1. 车厢调度问题

    (1) 以栈作为中转点

    (2) 栈的先进后出的性质正好符合火车的无序出站

    (3) 如果想要将序号为K的火车入栈,就必须将前K-1个入栈

    (4) 双指针操作,cur记录入过栈中的最大元素信息,top栈顶元 素信息

    (5) 如果将要出栈的数小于栈顶元素,运行结束,

    (6) 如果将要出栈的数等于栈顶元素,top--

    2. 阶梯式括号匹配问题

    (1) 将一整套的合法匹配枚举出来,从左往右一次递增编号

    (2) 消除条件为两者的和为一个常量,后者的编号必须大于等于前者

    3. 表达式计算

    感谢各位与信奥一本通的鼎力相助!

  • 相关阅读:
    表格维护:弹出
    表格联动
    表单查询
    浅谈分治 —— 洛谷P1228 地毯填补问题 题解
    The Captain 题解
    网课集训记
    2020-1-20寒假集训记
    博客使用声明
    JZOJ P5829 string 线段树
    线段树--CF438D The Child and Sequence
  • 原文地址:https://www.cnblogs.com/SeanOcean/p/10975629.html
Copyright © 2020-2023  润新知