棧Stack(陣列模擬 單鏈表模擬)

2021-10-21 14:02:20 字數 2540 閱讀 9623

入棧**:

出棧**:

應用場景:

3)表示式的轉換[中綴表示式-->字尾表示式]與求值(實際解決)。

4)二叉樹的遍歷。

5)圖形的深度優先搜尋法。

案例:

1.用陣列模擬棧的使用

思路分析:

定義乙個變數指標top,初始化top = -1,始終指向棧頂元素。

入棧操作push:當有資料加入到棧時,top++;stack[top];

出棧操作pop:從棧頂取出資料並返回,int value = stack[top];top--;return value;

public class stack 

// 判棧滿

public boolean isfull()else return false;*/

return top == maxsize;

}// 判棧空

public boolean isempty()

// 加元素於棧頂

public void push(int value)

stack[++top] = value;

}// 從棧頂彈出元素

public int pop()

return stack[top--];

}// 遍歷棧,從棧頂往下遍歷

public void show()

for(int i = top;i > -1;i--)}}

2.用單鏈表模擬棧

/*

public class listnode

} */

public class linkedliststack

// 判空

public boolean isempty()

// 判滿,鍊錶元素個數和maxsize相同

public boolean isfull()

return count == maxsize;

}// 往棧頂新增元素

public void push(int value)

// 頭插法

if(isempty()) listnode = new listnode(value); // 第乙個元素

else

}// 彈出棧頂元素

public int pop()

int temp = listnode.val;

listnode = listnode.next;

return temp;

}// 遍歷(與輸入順序相反,剛好滿足頭插,所以直接順序遍歷即可)

public void show()

listnode node = listnode; // 遍歷指標

while(node != null)}}

3.使用棧來實現綜合計算器--中綴問題

兩個棧:乙個專門存放數,乙個專門存放運算子。

步驟:1.通過index

掃遍歷字串表示式;

2.當掃瞄到的是數字,直接入數棧;

3.當掃瞄的是運算子,分情況入棧。

4.如果當前符號棧為空,該運算子直接入棧;如果當前符號棧不為空(有運算子),就對棧頂元素運算子與該運算子進行優先順序比較(小於等於,就從數棧pop出兩個數,從符號棧pop出乙個運算子,進行運算,將得到的結果再入數棧,該運算子也直接入棧,(注意此處並非繼續與當前符號棧下乙個棧頂元素比較,直到優先順序大於棧頂元素或棧空入棧,因為這樣就增加了遍歷的時間複雜度)

5.當表示式掃瞄完畢,就順序地從數棧和符號棧中pop出相應的數和運算子,並運算。

6.最後在數棧只有乙個數字,就是表示式的結果。

案例實現(3+2*6-2)

stack numberstack = new stack(10);

stack operstack = new stack(10);

string str = "3+2*6-2";

int num1 = 0;

int num2 = 0;

int oper = 0;

char chars = str.tochararray();

// 轉為陣列,以便遍歷

for (char val:chars) elseelse

}}else

}// 掃瞄完畢後,相應pop運算到數棧只剩結果

while(operstack.isempty())

// 列印結果

system.out.print("表示式" + str);

system.out.println("運算結果為:" + numberstack.pop());

用單鏈表模擬棧模型

include include struct node typedef struct node ptrtonode typedef ptrtonode stack struct node stack createstack void head next list return head int is...

模擬單鏈表

package l1 單鏈表 public class link title addnode description todo 新增節點 param param data 引數說明 return void 返回型別 throws public void addnode string data p.n...

模擬單鏈表

1.模擬單鏈表首先要定義節點class node 2.單鏈表的新增 2.1方式一 不按照順序 找到最後乙個節點直接新增 新增節點 public void addnode node node temp temp.next 最後乙個節點的next域指向要新增的節點 temp.next node 2.2方...