数据结构:栈的应用之表达式求值(C)

#数据结构:栈的应用之表达式求值(C)
#Day1

编写程序,实现算术表达式求值:
 设操作数:012,……,89(可扩充);(敲重点,这最大计算两位数(小白))
算符:+-*/,(,),#(#号为开始和结束符)。
输入格式:
一行数据,一个正确的算术表达式。
输出格式:
表达式求值后结果。
输入样式:8+(9/3-1)#
输出样式:10
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define Stacksize_S 30
#define Increase_Stack 20
typedef int Status;
typedef int SElemType;
typedef struct SNode{   
            SElemType  *base;
            SElemType *top;
            int Stacksize;
            }SNode,*LinkSNode;
void InitStack(SNode &S)//创建顺序栈
{
    S.base=(SElemType*)malloc(Stacksize_S*sizeof(SElemType));
    S.top=S.base;
    S.Stacksize=Stacksize_S;
}
void Push(SNode &S,SElemType e)//入栈操作
{
    if(S.top-S.base>=S.Stacksize)
    {
        SElemType* p;
        p=(SElemType*)realloc(S.base,(Stacksize_S+Increase_Stack)*sizeof(SElemType));
        S.base=p;
        if(!S.base) exit(ERROR);
    }
    *S.top++=e;
}
bool Pop(SNode &S,SElemType &e)//出栈
{
    if(S.base==S.top) return false;
    else
        e=*--S.top;
    return true;
}
int GetStack(SNode &S,SElemType &e)//读取栈顶元素
{
    if(S.base==S.top) return ERROR;
    else
    {
        e=*(S.top-1);
        return e;
    }

}

char StackCompare(SElemType e,SElemType c)//运算符优先级比较
{
   char compare;
	switch(e)
	{
	case ')':
		if(c=='(')
		{
			printf("输入语法错误!");
			exit(ERROR);
		}
		else
		{
			compare='>';
		}
		break;
	case '/':
	case '*':
		if(c=='(')
		{
			compare='<';
		}
		else
		{
			compare='>';
		}
		break;
	case '+':
	case '-':
		if(c=='(' || c=='/' || c=='*')
		{
			compare='<';
		}
		else
		{
			compare='>';
		}
		break;
	case '(':
		if(c==')')
		{
			compare='=';
		}
		else if(c=='#')
		{
			printf("输入语法错误!");
			exit(ERROR);
		}
		else
		{
			compare='<';
		}
		break;
	case '#':
		if(c=='#')
		{
			compare='=';
		}
		else if(c==')')
		{
			printf("输入语法错误!");
			exit(ERROR);
		}
		else
		{
			compare='<';
		}
		break;
	}
	return compare;
}

bool In(char c)//判断c是否为运算符
{
    switch (c)
    {
        case'+':
        case'-':
        case'*':
        case'/':
        case'(':
        case')':
        case'#':
            return true;
            break;
    }
        return false;
}
int  J_S(SElemType e,SElemType k1,SElemType k2)//计算k1?k2的值
{
    SElemType k;
    switch(e)
    {
        case '+':k=k2+k1;break;
        case '-':k=k2-k1;break;
        case '*':k=k2*k1;break;
        case '/':k=k2/k1;break;
        default:exit(ERROR);
    }
    return k;
}
int Opreation(SNode &S1,SNode &S2)//S1为运算符栈,S2为操作数栈
{
    char c;
    SElemType *kk;
    SElemType e,k1,k2,k;
    int num=0,flag=0;
    Push(S1,'#');
    c=getchar();
    while(c!='#'||GetStack(S1,e)!='#')
    {
        if(!In(c))
        {
            num = c-'0' ;
			Push(S2,num);
			c=getchar();
			if('0'<=c&&c<='9')
            {
                Pop(S2,e);
                num=num*10+(c-'0');
                Push(S2,num);
                num=0;
                c=getchar();
            }

        }

        else
            switch (StackCompare(GetStack(S1,e),c))//比较优先级
            {
            case'<'://新输入的算符优先级高,c进栈
                Push(S1,c);c=getchar();break;
            case'='://脱去括号,接受下一个字符
                Pop(S1,e);c=getchar();break;
            case'>'://新输入的算法优先级低,栈顶元素优先权高
                Pop(S1,e);
                Pop(S2,k2);Pop(S2,k1);
                Push(S2,J_S(e,k2,k1));
                //c=getchar();
                break;
            }
    }

    return (GetStack(S2,e));
}
int main()
{
    SNode S1,S2;
    InitStack(S1);//创建栈,S1为运算符栈,S2为操作数栈
    InitStack(S2);
    printf("%d \n",Opreation(S1,S2));
   return OK;
}

正在学习数据结构的小白一枚(记录一下)嘻嘻

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值