生活随笔
收集整理的這篇文章主要介紹了
HDU1237 简单计算器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://acm.hdu.edu.cn/showproblem.php?pid=1237
題解:??對(duì)于中綴表達(dá)式的運(yùn)算一般要轉(zhuǎn)化成后綴表達(dá)式再作運(yùn)算,開兩個(gè)棧,一個(gè)作為操作數(shù)棧StackDigital,一個(gè)作為操作符棧StackOperator。
1.定義一個(gè)函數(shù)判定優(yōu)先級(jí):# 的優(yōu)先級(jí)最低,為0,+ 和 - 的級(jí)別相同且高于 #,標(biāo)為1,* 和 / 的級(jí)別相同且高于 + 和 - ,標(biāo)志為2,
2.先往運(yùn)算符棧放入一個(gè) # (標(biāo)定界限),表達(dá)式最后也加一個(gè) #(?(標(biāo)定界限)),
3.遍歷表達(dá)式,若讀到數(shù)字,則以數(shù)字類型輸入,直接放到操作數(shù)棧,若讀到的是運(yùn)算符,則比較讀到的運(yùn)算符與運(yùn)算符棧頂符號(hào)的級(jí)別,
若比棧頂?shù)母?#xff0c;則入棧,否則,從數(shù)棧取兩個(gè)操作數(shù)根據(jù)操作符棧頂?shù)牟僮鬟M(jìn)行運(yùn)算,再把結(jié)果壓入數(shù)棧,剛剛讀到的運(yùn)算符再與現(xiàn)在運(yùn)算符棧
頂元素的級(jí)別進(jìn)行比較……最后數(shù)剩下的一個(gè)元素,就是結(jié)果。
?
#include <iostream>
#include <cstdio>
#include <string.h>
#include <ctype.h>
using namespace std;double stDit[300];
char stOp[300],str[300];
int top1,top2;int Priority(char op)
{if (op=='#') return 0;if (op=='+' || op=='-') return 1;if (op=='*' || op=='/')return 2;elsereturn -1;
}
double Operate(double x,double y,char op)
{if (op=='+') return x+y;if (op=='-') return x-y;if (op=='*') return x*y;if (op=='/') return x/y;else return -1;
}double Calc()
{double x,y,tmp;char op;int i,n = strlen(str);top1 = top2 = -1;stOp[++top2] = '#';str[n++] = '#';for(i=0; i < n; ++i){if (str[i]==' ')continue;if (isdigit(str[i])) //是數(shù)字{sscanf(str+i,"%lf",&tmp);stDit[++top1] = tmp; //stack pushwhile(isdigit(str[i+1])) //+1很重要++i;}else //是操作符{while (Priority(stOp[top2]) >= Priority(str[i]))//如果操作棧頂?shù)牟僮鞣麅?yōu)先級(jí)高,則作+-*/運(yùn)算{if (str[i]=='#' && stOp[top2]=='#')return stDit[top1];y = stDit[top1--];x = stDit[top1--];op = stOp[top2--];stDit[++top1] = Operate(x,y,op);}stOp[++top2] = str[i]; //如果新操作符優(yōu)先級(jí)高,str[i]進(jìn)棧}}return stDit[top1];
}
int main()
{int i;while (gets(str) != NULL && strcmp(str,"0")!=0){printf("%.2lf\n",Calc());}return 0;
}
?
總結(jié)
以上是生活随笔為你收集整理的HDU1237 简单计算器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。