棧Stack的實現及其應用

2021-08-15 23:11:35 字數 2822 閱讀 2654

棧:先進後出

實現方式有兩種,一種使用陣列,一種是鏈式結構

使用陣列的缺點就是在定義棧的時候就需要以某值初始化陣列,確定陣列的大小,也就是確定了棧的深度

/**

* 棧:底層用陣列實現

*/public

class

arrstack

//陣列滿的時候棧滿

public

boolean

isfull()

//棧空時top為-1

public

boolean

isempty()

public

void

push(object o)

elem[++top] = o;

}public object pop()

return elem[top--];

}public object peek()

return elem[top];

}}

/**

* 棧:底層利用鍊錶實現

* 入棧時我們從表頭新增節點(新增節點需要知道節點的前驅),我們不知道表尾節點的前驅節點

*/class node

public

node(object data)

public

node()

}public

class

linkstack

public

void

push(object o)

//出棧要判斷棧是否為空

public object pop()

node temp = top;

top = top.next;

temp.next = null;

size--;

return temp.data;

}public object peek()

return

this.top.data;

}public

void

display()

system.out.println();

}}

利用棧實現表示式的計算

表示式都是中綴表示法

1.首先利用棧將表示式轉換為字尾法表示

輸入中綴表示式,得到字尾表示式

思路:

(1)初始化乙個運算子棧

(2)從算術表示式輸入的字串中,從左到右的讀取乙個字元

(3)若當前的 字元是運算元,則直接送往字尾表示式

(4)若當前的字元是左括號,則將其壓入運算子棧

(5)若當前的字元是操作符,則進行如下 操作:

①當運算子棧為空時,直接將其壓入棧。

②當此運算子的優先順序高於棧頂的運算子時,則將此運算子壓入棧,否則,彈出棧頂運算子送往字尾式,並將當前運算子壓棧,重複步驟(5)

(6)若當前字元是右括號,反覆將棧頂符號彈出,並送往字尾表示式中,知道棧頂元素為左括號為止,然後將左括號出棧並丟棄

(7)若讀取還未結束,則重複步驟(2)

(8)若讀取結束,則將棧中剩餘的所有的運算子彈出並送往字尾表示式

2.利用棧計算字尾表示式的值

思路:

(1)如果遇到數字則將其壓棧

(2)如果是運算子則彈出棧中的兩個數字進行計算,同時將計算得到的結果壓棧。重複步驟(2)

public

class

/** * 如果是計算符,則返回true

*/private

boolean

isoperator(char c)

return

false;

}/**

* 如果是右括號,返回true

*/private

boolean

isopenright(char c)

/*** 如果是左括號,返回true

*/private

boolean

isopenleft(char c)

/*** 返回運算子的優先順序,括號的優先順序最低

*/private

intpriority(char c)

return

0; }

/***@param express 輸入的中綴表示式

*@return 字尾表示式

*/public string cover2postsuffix(string express)else

if(this.isopenright(c))

}else

if(isoperator(c))

if(o != null) // 將最後一次取出的優先順序低的運算子入棧

ls.push(o);

}ls.push(c);

}else}}

while(!ls.isempty())

return postfix;

}/**

* 根據傳入的字尾表示式,計算其值

*/public

double

numbercalculate(string postfix)

//計算結果壓棧

ls.push(d3);

}else}}

return (double)ls.pop();

}public

static

void

main(string args)

}

棧 Stack 的理解及其應用

棧的抽象資料型別 棧的抽象資料型別由以下結構和操作定義 棧被構造為項的有序集合,其中項被新增和從末端移除的位置稱為 頂部 棧是有序的 lifo 棧操作如下 簡單來說,類似於放一摞書,最先放的書在最下面,因此最後放的書最先取出來,而最後取出放的第一本書,棧就是這樣一種資料結構。我們可以用python的...

棧(stack)的應用

棧 stack 通常也被稱之為 堆疊 它的本質是線性表。堆 heap 通常我們也稱它為優先佇列,本質是樹。此處講述一些stack的應用。編譯器在檢查 這樣成對出現的符號所造成的語法錯誤時,通常並不需要去設計乙個很複雜的程式去判斷。而是使用乙個簡單的演算法,這個演算法用到乙個棧。演算法描述如下 做乙個...

棧(Stack)的Python實現

棧就是只能在一端插入和刪除資料的鍊錶,這個端就叫做棧頂 top 最後乙個新增的資料第乙個被刪除。因此,這也叫後進先出 last in first out 鍊錶或是先進後出鍊錶 first in last out 舉個例子,餐廳的盤子堆,盤子洗完要堆到上面,而不是插到下面的某個位置 相信不會有人那麼做...