前面有寫過逆波蘭計算器,那時候只能進行個位數計算,現在採用分隔符的辦法實現多位數即小數的計算,即在每個數字或者運算子或括號之後加上空格,來確定這個數是否輸入結束。逆波蘭式儲存在乙個陣列裡,然後按照逆波蘭計算規則就可以了,注意要使用atof轉換。下面是**部分。
#include#include#include#define capacity 50
typedef struct stack
*pstack,stack;
pstack initstack1()
int stackempty1(pstack st)
int stackfull1(pstack st)
int pushstack1(pstack st, char a)
else
}char popstack1(pstack st)
else
}char gettop1(pstack st)
typedef struct
*datastack;
datastack initstack2()
int stackempty2(datastack st)
int stackfull2(datastack st)
int pushstack2(datastack st, double data)
else
}double popstack2(datastack st)
else
}double gettop2(datastack st)
int priority(char op)
}int main(void)
popstack1(st);
break;
}case '+':
case '-':
case '*':
case '/':
else
}pushstack1(st, ch);
break;
}default:output[i++] = ch;}}
while(!stackempty1(st))
}output[i] = '\0';
free(st);
printf(" 字尾表示式為:");
for(m = 0; m <= i; m++)
printf("%c", output[m]);
printf("\n");
double num = 0;
char *pt = output;
while(*pt != '\0')
if(*pt == '.')
float pow = 1.0;
while(*pt >= '0' && *pt <= '9')
if(*pt == ' ')
pt++;
} if(priority(*pt) > 0) }
}printf(" 計算結果為: %f\n", gettop2(st2));
return 0;
}
這個問題從當初的幾乎判定為不能進行多位數的運算,到能表達出有多位數的逆波蘭表示式,到能實現多位數的計算,一點一點逼近目標。有時候困難並不是想象的那樣不可逾越,把複雜的問題細分成很多小步,逐個擊破,這是我編寫這個程式得到的收穫,也是適用於其他學習的學習方法。 逆波蘭計算器
include include include define stack init size 20 初始化棧的空間 define stackincrement 10 擴充套件空間 define maxbuffer 10 最大緩衝區 typedef double elemtype 建立乙個棧 type...
逆波蘭計算器
1.逆波蘭表示式用途 逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如 a b c d 轉換為ab cd 2.逆波蘭表示式邏輯實現 如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後...
逆波蘭計算器
遍歷表示式。碰到數字將其放到棧中。遇到計算符 從棧中彈出兩個數用計算然後再從新入棧。a 在棧中的最後乙個數即為結果 轉換前 2 9 6 3 5 4轉換後 2963 5 4 使用逆波蘭計算結果為 16.0public class rpncalculator 如果是不是計算符,直接入棧 stack.pu...