输入一个算术表达式,以#为结束符,如:(1+2)*3-4/2#,计算其值

输入一个算术表达式,以#为结束符,如:(1+2)*3-4/2#,计算其值
【问题描述】输入一个算术表达式,以#作为结束符,如:(1+2)*3#,计算该表达式的值

【输入形式】(1+2)*3-4/2#

【输出形式】7

【样例输入】(1+2)*3-4/2#

【样例输出】7

【样例说明】样例中只给出了0~9以内的四则运算,测试数据中有10以上的四则运算,如果要使程序完全通过所有测试,则要考虑2位数以上的运算。
【部分代码】

/***顺序实现表达式求值***/

#include<iostream>

#include<stdlib.h>

#include<stdio.h>

using namespace std;



//顺序栈定义

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define MAXSIZE  100

typedef int Status;

typedef int SElemType;

typedef struct{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;



//算法3.1 顺序栈的初始化

Status InitStack(SqStack &S)

{// 构造一个空栈 S 

S.base = new SElemType[MAXSIZE];//为顺序栈分配一个最大容量为MAXSIZE的数组空间

if(!S.base)

exit (OVERFLOW);    //存储分配失败

S.top = S.base;

S.stacksize = MAXSIZE;

return OK;

}

//算法3.2 顺序栈的入栈

Status Push(SqStack &S,SElemType e)

{ // 插入元素e为新的栈顶元素

if(S.top-S.base==S.stacksize)

return ERROR;//栈满

*(S.top++) = e;//元素e压入栈顶,栈顶指针加1

return OK;

}

//算法3.3 顺序栈的出栈

Status Pop(SqStack &S,SElemType &e)

{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

if(S.base == S.top)

return ERROR;//栈空

e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e

return OK;

}

//算法3.4 取顺序栈的栈顶元素

SElemType GetTop(SqStack S)

{// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

if(S.top == S.base)

return ERROR;

return *(S.top-1);//栈顶指针减1,将栈顶元素赋给e

}



Status In(SElemType c)// 应在前面有定义typedef char SElemType;

{ // 判断c是否为运算符
  switch(c)
  {
  	case'+':return true;
  	case'-':return true;
  	case'*':return true;
  	case'/':return true;
  	case'(':return true;
  	case')':return true;
  	case'#':return true;
   	default:return false;
  }

}



SElemType Precede(SElemType t1,SElemType t2)

 { //根据教材表3.1,判断两个运算符的优先关系

   SElemType f=' ';
   switch(t1)
   {
    case '+': 
   	    if(t2=='+'||t2=='-'||t2=='#'||t2==')')
   	    f='>';
   	else 
     	f='<';
    break;
    case '-':
   	    if(t2=='+'||t2=='-'||t2=='#'||t2==')')
   	    f='>';
   	else 
     	f='<';
    break;
    case '*':
   	    if(t2=='+'||t2=='-'||t2=='*'||t2=='/'||t2=='#'||t2==')')
   	    f='>';
   	else 
     	f='<';
    break;
    case '/':
   	    if(t2=='+'||t2=='-'||t2=='*'||t2=='/'||t2=='#'||t2==')')
   	    f='>';
   	else 
     	f='<';
    break;
    case '#':
   	    if(t2=='+'||t2=='-'||t2=='*'||t2=='/'||t2=='(')
   	    f='<';
   	else 
     	f='=';
    break;
    case '(':
   	    if(t2=='+'||t2=='-'||t2=='*'||t2=='/'||t2=='#'||t2=='(')
   	    f='<';
   	else 
     	f='=';
    break;
    case ')':
   	    if(t2=='+'||t2=='-'||t2=='*'||t2=='/'||t2==')'||t2=='#')
   	    f='>';
   	else 
     	f='<';
    break;
   }
   return f;

}



SElemType Operate(SElemType a,SElemType theta,SElemType b)

{

   SElemType c=0;
   switch(theta)
   {
   	case'+':
   		c=a+b;
   		break;
   	case'-':
   		c=a-b;
   		break;
	case'*':
   		c=a*b;
   		break;	
	case'/':
   		c=a/b;
   		break;	      	
   }
   return c;

}



//算法3.22 表达式求值

char EvaluateExpression()

{

// 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和操作数栈,

// OP 为运算符集合

SqStack OPTR,OPND;
InitStack(OPTR); 
InitStack(OPND);
Push(OPTR,'#');
int ch,theta,a,b,x;
ch=getchar();
char *str=new char[10];
int k=0,num=0;
bool flag=false;
while(ch != '#' || (GetTop(OPTR)!='#') )

{

  if (!In(ch))

   {
     str[k++]=ch;
     ch=getchar();
     flag=false;
   } // ch不是运算符则进栈

else
 {
	if(!flag)
	{
		str[k]='\0';
		num=atoi(str);
		Push(OPND,num);
		k=0;
		flag=true;
	}

    switch(Precede(GetTop(OPTR),ch))

   { //比较OPTR的栈顶元素和ch的优先权
    case '<': //当前字符ch压入OPTR栈,读入下一字符ch
    Push(OPTR, ch);
    ch = getchar();
    break;

    case '>': //弹出OPTR栈顶的运算符进行相应运算,并将运算结果入栈
    Pop(OPTR,theta);
    Pop(OPND, b);
    Pop(OPND, a);
    Push(OPND, Operate(a, theta, b));

    break;

    case '=': //脱括号并接收下一字符

    Pop(OPTR, x);

    ch = getchar();

    break;

    } // switch
 }
}// while
cout<<(int)GetTop(OPND)<<endl;
return GetTop(OPND);

// EvaluateExpression
}


int main()

{

//cout<<"请输入要计算的表达式(操作数和结果都在0-9的范围内,以#结束):"<<endl;

EvaluateExpression();

return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值