資料結構與演算法之 兩棧共享儲存空間

2021-06-20 10:58:26 字數 2300 閱讀 2819

其實棧的順序儲存很方便,因為它只在表尾進行操作,不存在普通線性表插入與刪除還需要移動元素的情況。同樣它也有普通線性表的缺陷,即必須確定數量。然而對於兩個相同型別的棧,卻可以做到最大限度地利用其開闢的儲存空間來進行操作。

陣列有兩個端點,兩個棧使用這乙個陣列的儲存區域,兩個棧有兩個棧底,分別為陣列的始端和末端。

這樣在壓棧的時候,是棧頂指標往中間靠攏,當兩指標相遇時,則棧滿。棧空即top1=-1,top2=n。而棧滿則是top1 + 1 == top2;

**實現:

sqdoublestack.h

/*兩棧共享空間--順序棧結構 */

#define maxsize 5

typedef int selemtype;

typedef struct

sqdoublestack;

#define ok 1

#define error 0

typedef int status;

status initstack(sqdoublestack *s); //初始化操作,建立乙個空棧s

status destroystack(sqdoublestack *s); //棧棧存在,則銷毀它

status clearstack(sqdoublestack *s); //將棧清空

int stackempty(sqdoublestack s,int stacknumber); //若棧為空,返回true,否則返回false

status gettop(sqdoublestack s,selemtype *e,int stacknumber); //若棧存在且非空,用e返回s的棧頂元素

status push(sqdoublestack *s,selemtype e,int stacknumber); //若棧s存在,將新元素e插入棧s中並成為棧頂元素

status pop(sqdoublestack *s,selemtype *e,int stacknumber); //刪除棧s中棧頂元素,並用e返回其值

int stacklength(sqdoublestack s,int stacknumber); //返回棧s的長度

sqdoublestack.c

#include#include#include#include "sqdoublestack.h"

int main(void)

status initstack(sqdoublestack *s) //初始化操作,建立乙個空棧s

status destroystack(sqdoublestack *s) //棧棧存在,則銷毀它

status clearstack(sqdoublestack *s) //將棧清空

int stackempty(sqdoublestack s,int stacknumber) //若棧為空,返回true,否則返回false

else if(2==stacknumber)

return 0;

}status gettop(sqdoublestack s,selemtype *e,int stacknumber) //若棧存在且非空,用e返回s的棧頂元素

*e = s.data[s.top1];

return ok;

} else if(2==stacknumber)

*e = s.data[s.top2];

return ok;

} return error;

}status push(sqdoublestack *s,selemtype e,int stacknumber) //若棧s存在,將新元素e插入棧s中並成為棧頂元素

if(1==stacknumber)

else if(2==stacknumber)

return error;

}status pop(sqdoublestack *s,selemtype *e,int stacknumber) //刪除棧s中棧頂元素,並用e返回其值

if(1==stacknumber)

else if(2==stacknumber)

return error;

}int stacklength(sqdoublestack s,int stacknumber) //返回棧s的長度

else if(2==stacknumber)

return -1;

}

事實上,使用這樣的資料結構,通常都是當兩個棧的空間需求有相反關係時,也即乙個棧增長時,另乙個棧在縮短。這樣使用兩棧共享空間儲存方法才有比較大的意義,否則兩個棧都在不停地增長,那很快就會有棧滿而溢位。

《資料結構與演算法》之棧

資料結構與演算法 之鍊錶 資料結構與演算法 之佇列 資料結構與演算法 之排序 資料結構與演算法 之二分查詢 資料結構與演算法 之二叉樹 關於 棧 我有乙個非常貼切的例子,就是一摞疊在一起的盤子。我們平時放盤子的時候,都是從下往上乙個乙個放 取的時候,我們也是從上往下乙個乙個地依次取,不能從中間任意抽...

資料結構與演算法之棧

中綴表示式實現多位數的計算 實現 public class calculatordemo else 否則直接入符號棧 else 如果是數字直接入數棧 else else index if index expresion.length 表示式掃瞄完後就順序的從數棧和符號棧中pop出相應的數字和符號並執...

資料結構與演算法之棧

字首表示式 求值 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果 例如 3 4 5 6 對應的字首表示式就是 3 4 5 6 針對字首表示...