兩棧共享空間



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;  
}                      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM