小白演算法積累 棧2 共享棧 棧頂相向 迎面增長

2021-10-03 05:06:12 字數 1158 閱讀 2876

題目:設有兩個棧s1,s2都採用順序棧方式,並共享乙個儲存區[0,…,maxsize-1],為了盡量利用空間,減少溢位的可能,可採用棧頂相向、迎面增長的儲存方式。試設計s1,s2,有關入棧和出棧的操作演算法。

關鍵字:共享棧+棧頂相向+迎面增長

思路

兩個棧共享向量空間,將兩個棧的棧底設在向量兩端,

初始時,s1棧頂指標為-1,s2棧頂指標為maxsize。

兩個棧頂指標相鄰時為棧滿。

兩個棧頂相向、迎面增長,棧頂指標指向棧頂元素。

初始化共享棧:

# define maxsize 100

//兩個棧共享順序儲存空間所能達到的最多元素數/最大容量,初始化100

# define elemtp int

//假設元素型別為整形

typedef

struct

stk;

//stack的縮寫

stk s;

//s是如上定義的結構型別變數,為全域性變數

本題關鍵:

兩個棧入棧和退棧時的棧頂指標的計算。

s1(top=-1)棧是通常意義下的棧;

s2(top=maxsize)棧入棧操作時,其棧頂指標左移(減1);

退棧時,棧頂指標右移(加1)

此外,對於所有棧的操作,都要注意「入棧判滿,出棧判空」

(1)入棧操作

intpush

(int i,elemtp x)

if(s.top[1]

-s.top[0]

==1)switch

(i)}

(2)退棧操作

elemtp pop

(int i)

switch

(i)else

return s.stack[s.top[0]

--];case1:

if(s.top[1]

==maxsize)

else

return s.stack[s.top[1]

++];}

//switch

}

小白演算法積累 棧1 判斷合法操作序列

題目 i 入棧,o 出棧。寫出乙個演算法,判定所給的操作序列是否合法。合法要求 棧的初態和終態均為空。若合法,返回true,否則返回false 假定被判定的操作序列已存入一維陣列中 關鍵字 判斷入棧出棧操作序列是否合法 思路 入棧 無論多少次,只要記憶體足夠,就可以進行 限制 記憶體足夠 出棧 必須...

專案2 建立鏈棧演算法庫

問題及 1.標頭檔案 listack.h,包含定義鏈棧資料結構的 巨集定義 要實現演算法的函式的宣告 ifndef listack h included define listack h included typedef char elemtype typedef struct linknode l...

資料結構與演算法 2 棧

2 儲存結構 2.2 鏈式儲存結構 定義 棧是限定僅在表尾進行插入和刪除的線性表。棧是一種線性表。允許插入和刪除的一端稱為棧頂,另一端稱之為棧底。不含任何元素的棧稱之為空棧,並且棧是後進先出。簡稱lifo結構。插入操作稱之為進棧,壓棧,刪除操作稱之為出棧,彈棧。adt 棧 stack data 同線...