C語言-資料結構-棧運用例項-計算器原始碼
阿新 • • 發佈:2019-01-09
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1. 目標</span>
編寫一個支援浮點數及括號的加減乘除計算器。
輸入:中綴表示式
輸出:字尾表示式及計算結果
注意:該程式碼在VS13上執行通過。
執行示例:
2. 實現流程
2.1 中綴表示式轉換為字尾表示式請參考如下連結:點選開啟連結
3. 原始碼
</pre><p><pre name="code" class="objc" style="font-size: 18px; font-weight: bold;">#include<stdio.h> #include<ctype.h> #include<stdlib.h> #define stacksize 30 #define stackincrease 30 #define maxvalume 30 #define expvalume 200 #define title "------------------------------Life is a fight!------------------------------------" typedef float Elemtype; typedef struct STACK{ Elemtype* top; Elemtype* base; int len; } stack; stack* InitStack() { Elemtype* t; stack* s; t=(Elemtype*)malloc(stacksize*sizeof(Elemtype)); s=(stack*)malloc(sizeof(stack)); s->top=t; s->base=t; s->len=stacksize; return s; } void PushStack(stack *s, Elemtype d) { if(s->top-s->base>=s->len-1) s->base=(Elemtype*)realloc(s->base,(s->len+stackincrease)*sizeof(Elemtype)); *s->top=d; s->top++; } void PopStack(stack* s, Elemtype* d) { if(s->top==s->base) { printf("\nErr!\n"); return; } *d=*--(s->top); } int LengthStack(stack *s) { return (s->top-s->base); } int GetExp(Elemtype* str)//讀取輸入的中綴表示式,儲存到str陣列中 { char c; int i=0; fflush(stdin); scanf("%c",&c); while(c!='\n') { if(i>expvalume) { printf("Err: The expression is too long!\n"); return -1; } *str++=c; i++; scanf("%c",&c); } if(i==0) { *str++='#'; } *str='\0'; return i; } void NiftoSuf(Elemtype* nif, Elemtype* suf)//將中綴表示式(nif)轉換為字尾表示式(suf) { int i, j, n; Elemtype c, t; stack *s; i=0; j=0; s=InitStack(); c=(char)nif[i]; while(c!='#')//'#'為輸入結束標誌 { while(isdigit(c)||c=='.')//以字元的方式讀取數字,將數字複製到suf中 { suf[j++]=c; c=(char)nif[++i]; if((c<'0'||c>'9')&&c!='.') { suf[j++]=' '; } suf[j]='\0'; } if(c==')') { PopStack(s, &t); while(t!='(') { suf[j++]=t; suf[j++]=' '; PopStack(s,&t); } suf[j]='\0'; } else if(c=='(') PushStack(s,c); else if(c=='+'||c=='-') { if(!LengthStack(s)) { PushStack(s,c); } else { do{ PopStack(s,&t); if(t=='(') { PushStack(s,t); } else { suf[j++]=t; suf[j++]=' '; suf[j]='\0'; } } while(LengthStack(s)&&t!='('&&c!='('); PushStack(s,c); } } else if(c=='*'||c=='/'||c=='(') { PushStack(s,c); } else if(c=='#' ) { while(LengthStack(s)) { PopStack(s,&t); suf[j++]=t; suf[j++]=' '; } break; } else { printf("\nErr:Expression Error\n"); return -1; } i++; c=nif[i]; } if(c=='#') while(LengthStack(s)) { PopStack(s,&t); suf[j++]=t; suf[j++]=' '; } suf[j++]='#'; suf[j]='\0'; free(s); } Elemtype Cal(Elemtype* suf) { int i, j; char c; Elemtype f, r, d1, d2; stack *s; i=0; j=0; s=InitStack(); char t[maxvalume]; c=suf[j++]; while(c!='#') { while(isdigit(c)||c=='.') { if(i>maxvalume) { printf("Err: The data is too large!\n"); return -1; } t[i++]=c; t[i]='\0'; c=suf[j++]; if(c==' ') { f=atof(t); PushStack(s,f); i=0; } } switch (c){ case '+': PopStack(s,&d2); PopStack(s,&d1); PushStack(s,d1+d2); break; case '-': PopStack(s,&d2); PopStack(s,&d1); PushStack(s,d1-d2); break; case '*': PopStack(s,&d2); PopStack(s,&d1); PushStack(s,d1*d2); break; case '/': PopStack(s,&d2); if(d2==0) { printf("Err: data error!\n"); return -1; } PopStack(s,&d1); PushStack(s,d1/d2); break; } c=suf[j++]; } PopStack(s,&r); printf("Result: %f",r); free(s); return r; } int main(void) { int i,j,k; char c,c1,y; Elemtype nif[expvalume], suf[expvalume]; printf("%s\n\n",title); do{ i=0; j=0; k=0; printf("Please enter the expression:\n"); GetExp(nif); NiftoSuf(nif,suf); printf("\n"); while(suf[k]!='\0') { c1=suf[k]; printf("%c",c1); k++; } printf("\n\n"); Cal(suf); printf("\n\n\n"); printf("\nPlease enter 'Y' for continual\n"); scanf("%c",&y); printf("\n"); fflush(stdin); } while(y=='Y'||y=='y'); return 0; }