資料結構(基於C語言) 簡單四則運算
阿新 • • 發佈:2019-02-08
//說明:只能進行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);
}
這裡是通過資料結構中的棧來實現簡單的數學計算,現有程式還不完善,不能進行小數和兩位數以上的加減乘除演算法,後續還會進行改進的。