其實棧的順序儲存很方便,因為它只在表尾進行操作,不存在普通線性表插入與刪除還需要移動元素的情況。同樣它也有普通線性表的缺陷,即必須確定數量。然而對於兩個相同型別的棧,卻可以做到最大限度地利用其開闢的儲存空間來進行操作。
陣列有兩個端點,兩個棧使用這乙個陣列的儲存區域,兩個棧有兩個棧底,分別為陣列的始端和末端。
這樣在壓棧的時候,是棧頂指標往中間靠攏,當兩指標相遇時,則棧滿。棧空即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 針對字首表示...