数据结构课程设计(VS2012-c语言):算术表达式实现(加减乘除)
生活随笔
收集整理的這篇文章主要介紹了
数据结构课程设计(VS2012-c语言):算术表达式实现(加减乘除)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關鍵詞:結構體、鏈表、棧、運算符優先級設置
實現效果:
源文件程序:
#include "head.h" int main() {//"34+4*(45-2*(31-30*10))"while(1){menu();//菜單func();//功能選擇system("pause");//暫停system("cls"); //清屏}return 0; }頭文件程序:
#include <stdio.h> #include <stdlib.h> #include "string.h" #define Max 100 //表達式字長限制 #define Max_ele 10 //元素字長限制 /* menu:菜單 func:功能展示 Mulcreat:創建結構體 Add:連接結構體 Cmp:優先級比較 Mulope:單位元運算 Trans:表達式字符串-〉結構體鏈表 Multiply:主體 */typedef struct mulstack {char el[Max_ele];struct mulstack *next; }C;void menu() {printf(" **************系統菜單**************\n");printf(" * 0.寫入表達式 * * 1.help *\n");printf(" *--------------- * * --------------*\n");printf(" * 2.關于程序 * * 3.退出系統 *\n");printf(" ************************************\n"); }C* Mulcreat(char c[10]){//創造個體 C* p=(C*)malloc(sizeof(C));strcpy(p->el,c);p->next=NULL;return p; }C* Add(C *head,C *p){//壓棧 p->next=head;return p; }//c高于head ,i=0 //c優先級低,i=1 int Cmp(C* head,char c[Max_ele]){//運算符能否壓入棧中(+ - * /) int i=0;char clt[50];clt['+']=1;clt['-']=1;clt['*']=2;clt['/']=2;if(clt[c[0]]<clt[head->el[0]]){i=1;}return i; }//atoi(str):字符到數字 //itoa(num,str,10):數字到字符 char* Mulope(char c1[Max_ele],char c2[Max_ele],char ope[Max_ele],C* Ope){//兩運算數、一運算符,進行運算 返回 char 類型 int res;static char ret[Max_ele];switch (ope[0]) {case '+': {if(Ope!=NULL){if(Ope->el[0]=='-'){res=atoi(c2)-atoi(c1);}else{res=atoi(c2)+atoi(c1);};}else{res=atoi(c2)+atoi(c1);}break; }case '-': {if(Ope!=NULL){if(Ope->el[0]=='-'){res=atoi(c1)-atoi(c2);}else{res=atoi(c2)-atoi(c1);};}else{res=atoi(c2)-atoi(c1);}break; }case '*':{res=atoi(c2)*atoi(c1);break; }case '/': {res=atoi(c2)/atoi(c1);break; }}itoa(res,ret,10);return ret; }C* Trans(char s[Max]){C* res1=NULL;int sl=strlen(s)-1,Sum=0,flag=1;while(sl!=-1){if(('9'>=s[sl] && s[sl]>='0')){char p[Max_ele];Sum+=(s[sl]-48)*flag;flag*=10,sl--;while(sl!=-1 && (('9'>=s[sl] && s[sl]>='0'))){Sum+=(s[sl]-48)*flag;flag*=10,sl--;}itoa(Sum,p,10);res1=Add(res1, Mulcreat(p));}if(s[sl]=='+' || s[sl]=='-' || s[sl]=='*' || s[sl]=='/' || s[sl]=='(' || s[sl]==')'){char q[Max_ele]={' ','\0'};q[0]=s[sl]; res1=Add(res1, Mulcreat(q));Sum=0;flag=1;sl--;}}return res1; }int Multiply(char s[Max]){C* sta=Trans(s);/*C* x=sta;while(x){printf("\n----%s",x->el);x=x->next;}*/C* Mul=NULL;//運算存儲棧C* Ope=NULL;//運算符棧while(sta){//操作次數運算數棧非空if(sta->el[0]!='+' && sta->el[0]!='-' && sta->el[0]!='*' && sta->el[0]!='/' && sta->el[0]!=')'){//加入運算數 Mul=Add(Mul,Mulcreat(sta->el)); sta=sta->next;} else{if(sta->el[0]==')'){//持續彈棧直至遇'(' while(1){char *c=Mul->el;//運算數1 Mul=Mul->next;char *c1=Mul->el;//運算數2 Mul=Mul->next;char *c2=Ope->el;//運算符 Ope=Ope->next;if(Mul->el[0]=='('){Mul=Mul->next;Mul=Add(Mul, Mulcreat(Mulope(c,c1,c2,Ope)));break;}Mul=Add(Mul, Mulcreat(Mulope(c,c1,c2,Ope)));}sta=sta->next;}else{//符號優先級比較(彈出) 和 '(6'if(Ope!=NULL && Cmp(Ope,sta->el) && Mul->next->el[0]!='('){char* c=Mul->el;//運算數1 Mul=Mul->next;char* c1=Mul->el;//運算數2 Mul=Mul->next;char* c2=Ope->el;//運算符 Ope=Ope->next;Mul=Add(Mul, Mulcreat(Mulope(c,c1,c2,Ope)));}else{//符號優先級比較(加入) Ope=Add(Ope,Mulcreat(sta->el));sta=sta->next;}}}}/*C* x=Mul;while(x){printf("\n----%s",x->el);x=x->next;}C* x1=Ope;while(x1){printf("\n----%s",x1->el);x1=x1->next;}*///最終:Mul、Ope出棧運算/*int num=0;C* x=Ope;while(x){x=x->next;num++;}int i=0;for(i;i<num;i++){char *c=Mul->el;//運算數1 Mul=Mul->next;char *c1=Mul->el;//運算數2 Mul=Mul->next;char *c2=Ope->el;//運算符 Ope=Ope->next;Mul=Add(Mul, Mulcreat(Mulope(c,c1,c2,Ope)));}*/while(Mul->next!=NULL){char *c=Mul->el;//運算數1 Mul=Mul->next;char *c1=Mul->el;//運算數2 Mul=Mul->next;char *c2=Ope->el;//運算符 Ope=Ope->next;//printf("\n%s...%s...%s",c,c1,c2);Mul=Add(Mul, Mulcreat(Mulope(c,c1,c2,Ope)));}if(Ope) return -1*atoi(Mul->el);return atoi(Mul->el); } void func() {int Func;printf("\n 功能選擇:");scanf("%d", &Func);printf("\n");switch (Func) {case 0: {char s[Max];int res;printf("\n 輸入表達式:");scanf("%s", s);if(s!=NULL){res=Multiply(s);printf("\n 計算結果為:%d\n",res); printf("\nsuccessful!\n");}else{printf("\nillegal input!\n");}break; }case 1: {printf("\nsuccessful!\n");break; }case 2: {printf("\nsuccessful!\n");break; }case 3: {printf("\nexit!\n");exit(1); }default: {printf("\n無此項功能!\n"); }} }總結
以上是生活随笔為你收集整理的数据结构课程设计(VS2012-c语言):算术表达式实现(加减乘除)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Jsoup库 实现天气爬取(附
- 下一篇: 2-快速排序C递归实现(递增递减的简单转