因為做二叉樹非遞迴的前後中遍歷,用到棧的方法。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的操作,得到...
波蘭式和逆波蘭式
字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.中綴和字尾同理 雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計...