10黑馬筆記之棧的應用 根據字尾表示式求解

2021-10-05 04:14:40 字數 3354 閱讀 3224

1 前提:

1)如果是數字,直接進棧。

2)如果是運算子,依次從棧中取右運算元和左運算元進行運算,運算結果放回棧中,直至棧中剩下最後乙個數字。

以上個例子求出的字尾表示式為例str = 「831-5*+」,831進棧,減號取兩運算元31運算結果為2,放回棧中,此時棧中有8和2。5進棧, 乘號運算2和5結果為10放回去。加號運算8和10也放回去,最終棧中只有18。最後彈出並輸出就可以。

也是利用鏈式棧實現。

2 標頭檔案:

#ifndef seqlinkstack

#define seqlinkstack

#include

#include

#include

//使用企業鍊錶實現,也可傳統

typedef

struct linksnodelinksnode;

//管理鍊錶結構體

typedef

struct linkstacklinkstack;

//鏈式棧初始化

linkstack*

init_linkstack()

;//入棧

intpush_linkstack

(linkstack *lstack,linksnode *data)

;//出棧

intpop_linkstack

(linkstack *lstack)

;//判斷是否為空

intisempty_linkstack

(linkstack *lstack)

;//返回第乙個有效元素

linksnode *

top_linkstack

(linkstack *lstack)

;//返回棧大小

intsize_linkstack

(linkstack *lstack)

;//清空鏈式棧

intclear_linkstack

(linkstack *lstack)

;//釋放記憶體

intdestory_linkstack

(linkstack *lstack)

;#endif

3 棧的實現:

#include

"seq_linkstack.h"

//鏈式棧初始化 ok

linkstack*

init_linkstack()

//入棧 ok

intpush_linkstack

(linkstack *lstack,linksnode *data)

if(data==

null

)//每次都在鍊錶的頭結點插入,與順序棧想反

//所以每次對頭結點操作插入

data-

>next =lstack-

>head.next;

lstack-

>head.next=data;

lstack-

>size++

;return0;

}//出棧 ok

intpop_linkstack

(linkstack *lstack)

if(lstack-

>size==0)

//也是只對頭結點操作

//使頭結點指向第二個有效節點

linksnode *first=lstack-

>head.next;

lstack-

>head.next=first-

>next;

//使head指向第二個元素

lstack-

>size--

;return0;

}//判斷是否為空

intisempty_linkstack

(linkstack *lstack)

if(lstack-

>size==0)

return0;

}//返回第乙個有效元素 ok

linksnode *

top_linkstack

(linkstack *lstack)

if(lstack-

>size==0)

return lstack-

>head.next;

}//返回棧大小 ok

intsize_linkstack

(linkstack *lstack)

return lstack-

>size;

}//清空鏈式棧 ok

intclear_linkstack

(linkstack *lstack)

//lstack->head.next=null;

lstack-

>size=0;

return0;

}//釋放記憶體

intdestory_linkstack

(linkstack *lstack)

free

(lstack)

;return0;

}

4 主要邏輯**:

#include

"seq_linkstack.h"

#include

//判斷是否為數字

intisnumber

(char p)

//判斷是否為運算子

intisoperator

(char p)

//運算

intmyoperate

(char op,

int p1,

int p2)

if(op==

'-')

if(op==

'*')if(

'/')

return0;

}//資料節點

typedef

struct mychar mychar;

void

test01()

//2如果是運算子 依次從棧中取右運算元和左運算元進行運算 運算結果放回棧中 直至棧中剩下最後乙個數字if(

isoperator

(*p)

) p++;}

//輸出結果if(

size_linkstack

(stack)==1

)//釋放棧

destory_linkstack

(stack);}

intmain()

總結字尾表示式:此例子總的來說也不算難,知道兩個簽個前提即可自行寫出。

棧的應用 中綴變字尾

中綴表示式 運算符號在數字中間 字尾表示式 運算符號在數字之後 計算機計算計算的是字尾表示式 中綴變字尾舉例 5 3 5 3 1 2 3 1 2 3 9 3 1 5 9 3 1 5 中綴變字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 符號 與棧頂符號進行優先順...

黑馬程式設計師之java學習筆記10

1.arraylist,hashset,hashmap底層都是用陣列來實現的。2.properties類 是hashtable的乙個子類,hashmap的用法一樣,其中主要方法是getproperty public string getproperty string key 例項 propertie...

棧的應用 字尾表示式

我看的是殷人昆版的 資料結構 在棧的應用中,介紹了字尾表示式,下面由我為大家稍微說明下字尾表示式的定義.字尾表示式 也叫rpn或逆波蘭表示式。它是中綴表示式的替代形式。參加運算的運算元總在操作符前面。例如 中綴表示式 a b c d e f 對應的字尾表示式為 abcd ef 詳細的字尾表示式的過程...