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;  
    }                      
  • 相关阅读:
    通俗易懂----欧几里得算法
    安卓贴图源码--->记录旋转后位置..类似in/百度魔图
    wait、notify、sleep、interrupt对比分析
    安卓内存泄漏及检测内存泄漏
    美团多渠道打包
    高版本api在低版本中的兼容
    常用工具
    双守护进程(不死service)-5.0系统以下
    安卓log4k问题解决
    10、面向对象以及winform的简单运用(isMdicontainer的设置、timer控件进行倒计时的制作)
  • 原文地址:https://www.cnblogs.com/muzijie/p/5655305.html
Copyright © 2011-2022 走看看