数据结构(基于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);
}

这里是通过数据结构中的栈来实现简单的数学计算,现有程序还不完善,不能进行小数和两位数以上的加减乘除算法,后续还会进行改进的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值