1. 程式人生 > >資料結構(基於C語言) 簡單四則運算

資料結構(基於C語言) 簡單四則運算

//說明:只能進行10以內整數的加減乘除,並且表示式的值要以“#”結尾
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100 //儲存空間初始分配量//
#define STACKINCREMENT 10   //儲存空間分配增量//



typedef char SElemType;
typedef int
Status; char a[][7]={ {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>'
,'>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} }; /*char a[][]={ {'>','>','>','>','<','>','<'}, {'>','>','>','>','<','>','<'}, {'<','<','>','>','<','>','<'}, {'<','<','>','>','<','>','<'}, {'<','<','<','<','<',' ','<'}, {'>','>','>','>','=','>',' '}, {'>','>','>','>',' ','>','='} };*/
char OP[7]={'+','-','*','/','(',')','#'}; typedef struct { SElemType* base; //在棧構造之前和銷燬之後,base的值為NULL// SElemType* top; //棧頂指標// int stacksize; //當前已分配的儲存空間,以元素為單位// }SqStack; //構造一個空棧S// int InitStack(SqStack &S) { S.base=(SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType)); if(!S.base) exit(ERROR); //儲存分配失敗// S.top=S.base; S.stacksize =STACK_INIT_SIZE; return OK; } Status GetTop(SqStack S) { //若棧不為空,則用e返回S的棧頂元素,並返回OK,否則返回ERROR// if(S.top==S.base) return ERROR; return *(S.top-1); } //插入元素// int Push(SqStack &S, SElemType e) { //插入元素e為新的棧頂元素// if(S.top-S.base>=S.stacksize) { //棧滿,追加儲存空間// S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) exit(ERROR); //儲存分配失敗// S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return OK; } int Pop(SqStack &S, SElemType &e) { //若棧不為空,則刪除S的棧頂元素,用e返回其值,並返回// if(S.top==S.base) return ERROR; e=*(--S.top); return OK; } //檢查是否為空棧// int EmptyStack(SqStack &S) { if(S.top==S.base) return 1; else return 0; } /*int ListTraverse(SqStack S,Status(*visit)(SElemType)) { SElemType *p; p=S.base; for(p=S.base;p<S.top;p++) (*visit)(*p); return OK; }*/ int Precede(char c1,char c2) { int i,j; switch(c1) { case'+':i=0; break; case'-':i=1; break; case'*':i=2; break; case'/':i=3; break; case'(':i=4; break; case')':i=5; break; case'#':i=6; break; } switch(c2) { case'+':j=0; break; case'-':j=1; break; case'*':j=2; break; case'/':j=3; break; case'(':j=4; break; case')':j=5; break; case'#':j=6; break; } return a[i][j]; } int Operate(char a,char theta,char b) { char result,i,j; i=a-48; j=b-48; switch(theta) { case'+':result=i+j+48;break;//因為數值是char型,所以要將0~9的ASCII碼值轉化為數值,進行計算後再轉為ASCII碼值儲存 case'-':result=i-j+48;break; case'*':result=(i*j)+48;break; case'/':result=(i/j)+48;break; } return result; } int In(char c,char OP[]) { int i,f=0; for(i=0;i<7;i++) { if(c==OP[i]) { f=1; break; } } if(f==0) return 0; else return 1; } //表示式求值// int EvaluateExpression() { // int a,b,c; char a,b,c,r; char theta,x; SqStack OPTR; SqStack OPND; InitStack(OPTR); Push(OPTR,'#'); InitStack(OPND); c=getchar(); while(c!='#'||GetTop(OPTR)!='#') { if(!In(c,OP)) { Push((OPND),c); c=getchar(); } else switch(Precede(GetTop(OPTR),c)) { case'<': Push(OPTR,c); c=getchar(); break;//1+2#:如加上printf("1234%c\n",c)語句可以看到c為+號 case'=': Pop(OPTR,x); c=getchar();break; case'>': Pop(OPND,b); Pop(OPTR,theta); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break;//theta未取到棧頂元素,即在1+2的過程中theta未取到+號 } } r=GetTop(OPND)-48;//將數值由ASCII碼值轉化為十進位制的數值 return r; } void main() { int c; printf("請輸入需要計算的表示式:\n"); c=EvaluateExpression(); printf("result=%d\n",c); }

這裡是通過資料結構中的棧來實現簡單的數學計算,現有程式還不完善,不能進行小數和兩位數以上的加減乘除演算法,後續還會進行改進的。