数据结构课程设计之简单计算器的实现
生活随笔
收集整理的這篇文章主要介紹了
数据结构课程设计之简单计算器的实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、問題陳述
從鍵盤上輸入一算術(shù)表達(dá)式(中綴白大師),包括圓括號,計(jì)算出表達(dá)式的值。
要求:
二、概要設(shè)計(jì)
2.1 概要簡述
中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式,從左到右遍歷中綴表達(dá)式的每個(gè)數(shù)字和符號,若是數(shù)字就輸出,即成為后綴表達(dá)式的一部分;若是符號,則判斷其與棧頂符號的優(yōu)先級,是右括號或優(yōu)先級低于找頂符號(乘除優(yōu)先加減)則棧頂元素依次出找并輸出,并將當(dāng)前符號進(jìn)棧,一直到最終輸出后綴表達(dá)式為止。
后綴表達(dá)式也稱為逆波蘭表達(dá)式,計(jì)算方法為:新建一個(gè)表達(dá)式,如果當(dāng)前字符為變量或者為數(shù)字,則壓棧,如果是運(yùn)算符,則將棧頂兩個(gè)元素彈出作相應(yīng)運(yùn)算,結(jié)果再入棧,最后當(dāng)表達(dá)式掃描完后,棧里的就是結(jié)果。
2.2 存儲結(jié)構(gòu)表示
typedef struct {//數(shù)字棧結(jié)構(gòu)體double data[MAXSIZE];int top; } opstack;typedef struct {//符號棧結(jié)構(gòu)體char data[MAXSIZE];int top; } stack;2.3 詳細(xì)設(shè)計(jì)
2.3.1 判斷中綴表達(dá)式是否合理
//判斷中綴表達(dá)式是否合理 bool judge_infix(char str[]){int temp=0;if(str[0]=='/'||str[0]=='*')return false;if(str[strlen(str)-1]<'0'&&str[strlen(str)-1]>'9')return false;for(int i=0; i<strlen(str); i++) {if(str[i]=='(') {if(i==0&&(str[i+1]=='*'||str[i+1]=='/'))return false;else if(str[i-1]>='0'&&str[i-1]<='9')return false;temp++;} else if(str[i]==')') {if(i==0)return false;else if(str[i-1]=='+'||str[i-1]=='*'||str[i-1]=='-'||str[i-1]=='/')return false;else if(str[i+1]>='0'&&str[i+1]<='9')return false;temp--;}}if(temp==0)return true;return false; }2.3.2 中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式
創(chuàng)建棧
從左向右順序遍歷中綴表達(dá)式:
- 數(shù)字直接輸出
- 運(yùn)算符:
遇到‘(’直接入棧,遇到‘)’將棧中‘(’之后入棧的全部輸出,同時(shí)‘(’出棧但是不輸出。其他符號將符號棧中的元素依次出棧并輸出,直到遇到比當(dāng)前符號優(yōu)先級更低的符號或者‘(’,將當(dāng)前符號入棧。
將棧中剩余的符號依次輸出。
2.3.3 計(jì)算后綴表達(dá)式值
三、測試與運(yùn)行
3.1 判斷表達(dá)式是否正確
3.2 簡單四則運(yùn)算
3.3 含平方運(yùn)算
四、代碼實(shí)現(xiàn)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define MAXSIZE 50typedef struct {//數(shù)字棧結(jié)構(gòu)體double data[MAXSIZE];int top; } opstack;typedef struct {//符號棧結(jié)構(gòu)體char data[MAXSIZE];int top; } stack;//初始化棧 void InitStack(stack *s) {s->top=0; }//取棧頭 int GetTop(stack s, char *e) {if(s.top<=0)return 0;else {*e=s.data[s.top-1];return 1;} }//出棧操作 void Pop(stack *s, char *e) {if(s->top<=0)printf("棧空!");else*e=s->data[--s->top]; }//入棧操作 void Push(stack *s, char e) {if(s->top>=MAXSIZE)printf("棧滿!");elses->data[s->top++]=e; }//判斷棧空 int StackEmpty(stack s) {if(s.top==0)return 1;else return 0; }//計(jì)算表達(dá)式值 double ComputeExpress(char a[]) {opstack s;int i=0, value;float x1, x2, result;s.top=-1;while (a[i]!='\0') {if(a[i]!=' '&&a[i]>='0'&&a[i]<='9') {value=0;while (a[i]!=' ') {value=10*value+a[i]-'0';i++;}s.top++;s.data[s.top]=value;} else {switch(a[i]) {case '+':x1=s.data[s.top--];x2=s.data[s.top--];result=x1+x2;s.data[++s.top]=result;break;case '-':x1=s.data[s.top--];x2=s.data[s.top--];result=x2-x1;s.data[++s.top]=result;break;case '*':x1=s.data[s.top--];x2=s.data[s.top--];result=x1*x2;s.data[++s.top]=result;break;case '/':x1=s.data[s.top--];x2=s.data[s.top--];result=x2/x1;s.data[++s.top]=result;break;case '^':x1=s.data[s.top--];x2=s.data[s.top--];result=pow(x2,x1);s.data[++s.top]=result;break;}i++;}}if(!s.top!=-1) {result=s.data[s.top];s.top--;if(s.top==-1)return result;else {printf("表達(dá)式錯(cuò)誤!");//exit(-1);}} }//中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式 void TranslateExpress(char str[], char exp[]) {stack s;char ch, e;int i=0, j=0;InitStack(&s);ch=str[i++];while(ch!='\0') {switch(ch) {case '(':Push(&s,ch);break;case ')':while (GetTop(s,&e)&&e!='(') {Pop(&s,&e);exp[j++]=e;}Pop(&s,&e);break;case '+':case '-':while (!StackEmpty(s)&&GetTop(s,&e)&&e!='(') {Pop(&s,&e);exp[j++]=e;}Push(&s,ch);break;case '*':case '/':while(!StackEmpty(s)&&GetTop(s,&e)&&e=='/'||e=='*'||e=='^') {Pop(&s,&e);exp[j++]=e;}Push(&s,ch);break;case '^':while(!StackEmpty(s)&&GetTop(s,&e)&&e=='^') {Pop(&s,&e);exp[j++]=e;}Push(&s,ch);break;case ' ':break;default:while(ch>='0'&&ch<='9') {exp[j++]=ch;ch=str[i++];}i--;exp[j++]=' ';}ch=str[i++];}while(!StackEmpty(s)) {Pop(&s,&e);exp[j++]=e;}exp[j]='\0'; }//判斷中綴表達(dá)式是否合理 bool judge_infix(char str[]){int temp=0;if(str[0]=='/'||str[0]=='*')return false;if(str[strlen(str)-1]<'0'&&str[strlen(str)-1]>'9')return false;for(int i=0; i<strlen(str); i++) {if(str[i]=='(') {if(i==0&&(str[i+1]=='*'||str[i+1]=='/'))return false;else if(str[i-1]>='0'&&str[i-1]<='9')return false;temp++;} else if(str[i]==')') {if(i==0)return false;else if(str[i-1]=='+'||str[i-1]=='*'||str[i-1]=='-'||str[i-1]=='/')return false;else if(str[i+1]>='0'&&str[i+1]<='9')return false;temp--;}}if(temp==0)return true;return false; }int main() {char a[MAXSIZE],b[MAXSIZE];double f;int flag=0;printf("請輸入一個(gè)算術(shù)表達(dá)式:");gets(a);printf("中綴表達(dá)式為: %s\n",a);bool judge = judge_infix(a);if(judge == false){printf("表達(dá)式有誤!\n");system("pause");exit(-1);}elseTranslateExpress(a,b);printf("后綴表達(dá)式為: %s\n",b);f=ComputeExpress(b);printf("計(jì)算結(jié)果為: %f\n",f);system("pause");return 0; }總結(jié)
以上是生活随笔為你收集整理的数据结构课程设计之简单计算器的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作184:自定义事件
- 下一篇: 集成电路封测行业科普