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 詳細的字尾表示式的過程...