zoukankan      html  css  js  c++  java
  • 两栈共享空间


    1 思路
      如果有两个类型相同的栈,我们为它们分别开辟了数组空间。极有可能是一个栈已经满了,再入栈就溢出了,而另一个栈却还有很多存储空间。这又何必呢?我们完全可以用一个数组来存储两个栈,只不过需要一些小的技巧。
      我们的做法如下,数组有两个端点,两个栈有两个栈底。让一个栈的栈底为数组的始端,即数组下标为0的位置。让另一个栈的栈底为数组的末端,即数组下标为n-1的位置。这样如果两个栈增加元素,就是两端点向中间延伸。

      其实关键思路是:它们是在数组的两端,向中间靠拢。top1和top2是两个栈的栈顶指针。只要它们两个不见面,两个栈就可以一直使用。

    2 两栈共享空间的结构代码

    typedef struct {
        SElemType data[MAXSIZE];
        int top1;                    //栈1的栈顶指针(top1==-1,表示栈1为空)
        int top2;                    //栈2的栈顶指针(top2==MAXSIZE,表示栈2为空)
    }SqDoubleStack;        

    3 入栈操作

    Status push(SqDoubleStack *S, SElemType e, int stackNumber) {
        if (S->top1 + 1 == S->top2) {                    //栈满
            return ERROR;    
        }
        if (stackNumber == 1) {                    //表示栈1有元素进栈
            top1 ++;
            S->data[top1] = e;
        } else if (stackNumber == 2) {                    //表示栈2有元素进栈
            top2--;
            S->data[top2] = e;
        }
        return OK;
    }    

    4 出栈操作

    Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber) {
        if (stackNumber == 1) {                //说明是删除栈1元素
              if (S->top1 == -1) {                    //栈1空
                return ERROR;
            }
            *e = S->data[S->top1]
            S->top1--;
        } else if (stackNumber == 2) {              //说明是删除栈2元素
            if (S->top2 == MAXSIZE) {        //栈2空
                return ERROR;            
            }
            *e = S->data[S->top2];
            S->top2++;
        }
        return OK;  
    }                      
  • 相关阅读:
    灾备架构图
    Dashboard有什么用
    第一次使用Docker的完整过程
    网页端的消息接收方式
    我理解中的应用架构
    数字化转型模型
    工业4.0的下一个十年
    一文读懂华为全屋智能一文读懂华为全屋智能
    支付总架构解析
    spring boot:shardingsphere+druid整合seata分布式事务(spring boot 2.3.3)
  • 原文地址:https://www.cnblogs.com/muzijie/p/5655305.html
Copyright © 2011-2022 走看看