(棧的思想)逆波蘭(后綴表達(dá)式)(1-2)×(4+5)==1 2 - 4 5 + *
一、要求——實(shí)現(xiàn)對(duì)逆波蘭輸入表達(dá)式進(jìn)行計(jì)算(輸入正確)——支持帶小數(shù)點(diǎn)的數(shù)據(jù)
二、正常表達(dá)式--》逆波蘭表達(dá)式(這個(gè)理解需要自己總結(jié)理解,或者網(wǎng)上也有很多)
a+b--》a b +a+(b-c)--》a b c - +(有括號(hào)的先操作)a+(b-c)*d--》a b c - d * +(先乘除后加減,但有括號(hào)優(yōu)先級(jí)問(wèn)題所以先減(想想棧的思想就是分別放入兩個(gè)數(shù)據(jù)到棧然后放入運(yùn)算符時(shí)數(shù)據(jù)出棧計(jì)算,計(jì)算結(jié)果入棧))a+d*(b-c)--》a d b c - * +三、圖片解析(1-2)*(4+5)==1 2 - 4 5 + *
四、實(shí)例RPN計(jì)算器代碼(棧思想)
/************************************************************************* > File Name: RPN計(jì)算器.c > Author: geeker > Mail: 932834897@QQ.com > Created Time: 2017年02月06日 星期一 20時(shí)16分15秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<math.h>#include<ctype.h>//提供函數(shù)isdigit判斷char參數(shù)是否為數(shù)字#define stacksize 20#define maxbuffer 10//最大緩沖區(qū)typedef double ElemType;typedef struct{ ElemType *base; ElemType *top; int maxsize;}sqStack;void InitStack(sqStack *s)//初始化{ s->base=(ElemType *)malloc(stacksize * sizeof(ElemType)); if(!s->base) exit(0); s->top=s->base; s->maxsize=stacksize;}void Push(sqStack *s,ElemType e)//壓棧{ if(s->top-s->base>=s->maxsize) return; *(s->top)=e; s->top++;}void Pop(sqStack *s,ElemType *e)//出棧{ if(s->top==s->base) return; *e=*--(s->top);}int StackLen(sqStack s)//(看清s不是指針),計(jì)算當(dāng)前容量{ return(s.top-s.base);//點(diǎn)是結(jié)構(gòu)不是指針}int main(){ sqStack s; char c; double d,e; char str[maxbuffer];//緩沖區(qū),作用比如scanf輸入1234,計(jì)算機(jī)并不會(huì)覺(jué)得是1234,而會(huì)是字符1,字符2. int i=0; InitStack(&s); PRintf("請(qǐng)按逆波蘭表示示輸入計(jì)算數(shù)據(jù),數(shù)據(jù)用空格隔開(kāi),以#作為結(jié)束標(biāo)志/n"); scanf("%c",&c);//怎么把c轉(zhuǎn)化成double數(shù)據(jù) while(c!='#'){ while(isdigit(c)||c=='.'){//這個(gè)函數(shù)判斷char參數(shù)是否為數(shù)字(其實(shí)判斷ASCII是否在48-57之間),頭文件#include "ctype.h" str[i++]=c; str[i]='/0';//因?yàn)閿?shù)組沒(méi)有初始化,所以下一個(gè)數(shù)據(jù)給他初始化為0,此0為字符0,與數(shù)字0區(qū)別在于內(nèi)存空間等 if(i>=10){ printf("出錯(cuò),輸入單個(gè)數(shù)據(jù)過(guò)大!/n"); return -1; }//緩沖區(qū)有最大范圍 scanf("%c",&c); if(c==' '){//比如輸入12 3,接受空格表示12輸入結(jié)束了 d=atof(str);//這個(gè)函數(shù)功能:將字符串轉(zhuǎn)化為double型,需要頭文件#include "stdlib.h",傳入?yún)?shù)是字符串,返回double型數(shù)據(jù) Push(&s,d); i=0;//i初始化 break; } } switch(c){//遇到數(shù)字就進(jìn)棧,遇到加減乘除就出棧計(jì)算 case'+': Pop(&s,&e); Pop(&s,&d); Push(&s,d+e);break;//將兩個(gè)數(shù)字拿出來(lái),再運(yùn)算,再把結(jié)果放進(jìn)去 case'-': Pop(&s,&e); Pop(&s,&d); Push(&s,d-e);break;//d-e原因:比如1-2,1先進(jìn)棧,所以2先出棧,所以后出棧-先出棧 case'*': Pop(&s,&e); Pop(&s,&d); Push(&s,d*e);break; case'/': Pop(&s,&e); Pop(&s,&d); if(e!=0){ Push(&s,d/e);break;//d/e與減同樣的道理,最重要是除法要判斷,除數(shù)不能為0 } else{ printf("/n出錯(cuò):除數(shù)為零!"); return -1; } break; } scanf("%c",&c); } Pop(&s,&d);//把最終結(jié)果放在任何里面都行不一定d,自己重新定義一個(gè)也可以 printf("/n最終的計(jì)算結(jié)果為: %lf",d); return 0;}//5-(6+7)*8+9/4//5-13*8+9/4//5-104+2.25//-99+2.25//-96.75//5 6 7 + 8 * - 9 4 / +//結(jié)果 -96.750000五、注意因?yàn)橐陨蠈?shí)例代碼我實(shí)在linux下編寫,格式為UTF-8,如果將我的代碼復(fù)制粘貼去的話遇見(jiàn)中文亂碼的話可以將格式改為ANSI即可,若沒(méi)問(wèn)題那也沒(méi)啥事
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注