資源簡介
采用棧將中綴表達式轉為后綴表達式并求出數值。包含的運算符有'+', '-' ,'*','/','%'。支持整數,小數,正負數
代碼片段和文件信息
#include
#include
#include
#define?Maxlenth?100
typedef?struct?Stack{
int?top;
char?s[Maxlenth];
}Stack;
char?Pop(Stack?*S);
char?top(Stack?*S);
int?Isempty(Stack?*S);
double?Calculate(char?*Arrayint?len);
void?stackToArray(Stack?*Schar?*chint?len);
void?Push(Stack?*Schar?pu);
void?Print(Stack?*S);
void?clean(char?*A);
void?check(char?*ch);
int?main()
{
????Stack?num;
????num.top=Maxlenth;/*定義存儲操作數的棧的空棧底位置*/
????Stack?sign;
????sign.top=Maxlenth;/*定義存儲操作符的棧的空棧底位置*/
????Stack?*N=#
????Stack?*S=&sign;
????char?c=‘?‘;
????int?i=0;
????char?mid[Maxlenth]={‘\0‘};
????gets(mid);/*讀入中綴表達式*/
????check(mid);/*判斷是否為合法輸入,非法輸入時程序退出*/
????int?j=0;
????/*將負數的負號用A表示,以區別減號和負號*/
????if(mid[0]==‘-‘)
????{
???????mid[0]=‘A‘;
????}
????for(j=1;j ????{
????????if(mid[j-1]==‘(‘&&mid[j]==‘-‘)
????????{
????????????mid[j]=‘A‘;
????????}
????}
????/*按照優先級規則將操作符進棧出棧,操作數入棧時相鄰操作數用空格間隔開。
??????最終的后綴表達式保存在操作數棧中。
????*/
????for(i=0;i ????{??//判斷mid[i]是否為操作數的一部分,如果是則直接壓入操作數棧
????????if(?(mid[i]>=‘0‘&&mid[i]<=‘9‘)||mid[i]==‘A‘||mid[i]==‘.‘)
????????{
????????????if(mid[i]==‘A‘)
????????????{
????????????????Push(N‘-‘);
????????????}
???????????else{
????????????????????Push(Nmid[i]);
???????????}
????????}
????????else
????????{
????????????if(mid[i]==‘(‘)
????????????{
????????????????Push(Smid[i]);
????????????}
????????????else
????????????{
????????????????if(mid[i]==‘+‘||mid[i]==‘-‘)
????????????????{
????????????????????while(top(S)!=‘(‘&&(!Isempty(S)))
????????????????????{
????????????????????????Push(Nc);?//將空格壓入操作數棧以區分相鄰的兩個操作數
????????????????????????Push(NPop(S));
????????????????????}
????????????????????Push(Nc);
????????????????????Push(Smid[i]);
????????????????}
????????????????else
????????????????{
????????????????????if(mid[i]==‘*‘||mid[i]==‘/‘||mid[i]==‘%‘)
????????????????????{
????????????????????????while((top(S)==‘*‘||top(S)==‘/‘||top(S)==‘%‘)&&(!Isempty(S))?)
????????????????????????{?//彈出優先級大于或等于mid[i]的操作符到操作數棧,
??????????????????????????//直到棧頂元素優先級比mid[i]小或者棧空為止
????????????????????????????Push(Nc);
????????????????????????????Push(NPop(S));
????????????????????????}
????????????????????????Push(Nc);
????????????????????????Push(Smid[i]);
????????????????????}
????????????????????else
????????????????????{
????????????????????????if(mid[i]==‘)‘)//遇到左括號時彈操作符棧到操作數棧,直到彈出左括號為止
????????????????????????{
????????????????????????????while(top(S)!=‘(‘?)
????????????????????????????{
????????????????????????????????Push(Nc);
????????????????????????????????Push(NPop(S));
????????????????????????????}
????????????????????????????Push(Nc);
????????????????????????????Pop(S);
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????}
????//把操作符棧的元素彈出到操作數棧
????while(!Isempty(S))
????{
????????Push(Nc);
????????Push(NPop(S));
評論
共有 條評論