逆波蘭式 棧實現

2021-06-27 13:41:12 字數 1803 閱讀 1568

因為做二叉樹非遞迴的前後中遍歷,用到棧的方法。xpp說那就乾脆把四則運算,逆波蘭式 棧的實現做了。

這是參考別人的程式寫的,注釋比較亂。而且這個是直接實現計算機計算的四則運算,沒有將逆波蘭的表示式列印出來。今天腰太酸了,明天改一改,把逆波蘭式列印出來噻333333.棧還有迷宮演算法是不是???現在腦子裡之前看的非遞迴遍歷都想不起來了我擦

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include"string.h"

#define max_ope_len 10

#define max_string_len 100

#define max_stack_len 100

//typedef struct operater

operater;

operater opstack[max_ope_len];

int opstacktop=-1;//外加乙個指示棧頂的數,這也挺奇葩的

double numstack[max_stack_len];

int numstacktop=-1;

int getpior(char name)

if (name=='+'||name=='-')

if(name=='*'||name=='/')

if(name=='!')

exit(1);//其他情況則直接退出

}int getopernum(char name)

if(name=='!')

if(name=='('||name==')')//特別注意括號的運算元為0;

exit(1);

}void pushoperater(operater op)//入棧操作的是乙個 運算子

if (*s=='.') }

(*i)=(*i)+j;

string[j]='\0';//表示字元結束

return atof(string);//將這個字元轉化為num

}double operater2num(operater op)

if (op.name=='-')

if(op.name=='*')

if(op.name=='/')

}//**********===這部分也是比較難的,暫時可以不看啊**********=

double operater1num(operater op)//非操作?為何是這樣??

return result;

}exit(1);

}double operater(operater op)

if (op.opernum==1)

exit(1);

}//進入複雜的主函式操作

int main()

else if (op.name==')')

}else

else

pushoperater(op);

}i++;//因為操作符是乙個乙個的字元,上面字元與數字轉換的時候,可能不是乙個乙個的加的

}

//string已經轉換完了,這個時候操作符棧還有剩,則全部取出來操作

js實現逆波蘭式

我們在寫算數表示式時,常用的表示式為中綴表示式形如a b c d e 而將中綴表示式轉化為字尾表示式則是為了更方便機器進行運算,字尾表示式形如abcd e 中綴轉字尾的大體思路為 首先我們要建立兩個陣列物件 乙個用於儲存符號表示式,另乙個則用來記錄字尾表示式元素。另外這兩個陣列採用push,pop的...

C 實現逆波蘭式

a b c的逆波蘭式為ab c,假設計算機把ab c按從左到右的順序壓入棧中,並且按照遇到運算子就把棧頂兩個元素出棧,執行運算,得到的結果再入棧的原則來進行處理,那麼ab c的執行結果如下nkqnqmthw 1 a入棧 0位置 2 b入棧 1位置 3 遇到運算子 將a和b出棧,執行a b的操作,得到...

波蘭式和逆波蘭式

字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.中綴和字尾同理 雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計...