算术表达式

算术表达式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

算术表达式——C++


算术表达式

表达式求值是数学中的一个基本问题,也是程序设计中的一个经典问题。我们所涉及的表达式中包含数字(一位正整数)和运算符号,本课程设计中处理的运算符号包括‘+’、‘-’、‘*’、‘/’、‘(’和‘)’。要求按照我们所习惯的计算顺序,正确计算出表达式的值,并输出至屏幕上。为了计算方便,表达式以#号开始,并以#号结束输入。

一、函数目录

创建栈并初始化(InitStack)
入栈(Push)
出栈(Pop)
判断操作符函数(In)
取栈顶元素(GetTop)
优先级函数(Precede)
求值函数(Operate)
数字转化(number)
表达式求值函数(EvaluateExpression)
其他:操作符栈(OPTR),操作数栈(OPND)

判断优先级

// 通过建立二位数组将优先级关系写入,然后switch-case进行选择
	char pre[7][7] = {  ///优先级表 
	//    +    -    *    /    (    )    #	
		{'>', '>', '<', '<', '<', '>', '>'},  //  +
		{'>', '>', '<', '<', '<', '>', '>'},  //   -
		{'>', '>', '>', '>', '<', '>', '>'},  //   *
		{'>', '>', '>', '>', '<', '>', '>'},  //   /
		{'<', '<', '<', '<', '<', '=', '0'},  //  (
		{'>', '>', '>', '>', '0', '>', '>'},  //   )
		{'<', '<', '<', '<', '<', '0', '='}  //    #
	};

进行二元计算`。

// 进行计算
char Operate(char a, char theta, char b)
 {

 	
 	switch(theta){
	 	case '+':
	 		return a+b;
	 		break;
 		case '-':
 			return a-b;
 			break;
		case '*':
			return a*b;
			break;
		case '/':
			if(b!='0'){     //b不能为0
				return a/b;
				break;
			}
			else{
				cout<<"Divisor can not be 0!";  //提示输出,可不用写
				break;
			}
	 }
 } 

数字转化

// 将数字的字符串转化为整型
int number(char ch)
 {
 	return (int)(ch-'0');
 }

二、完整代码

#include<iostream>

using namespace std;

#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW 0

typedef  char Status;
typedef char SElemType;
typedef struct
{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

//初始化空栈
Status InitStack(SqStack &S)
{
	S.base = new SElemType[MAXSIZE];
	if(!S.base)  exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
 } 
 
 //入栈操作
 Status Push(SqStack &S, char e)
 {
 	//栈顶插入元素e
	 if(S.top - S.base == S.stacksize)  return ERROR;
	 *S.top ++= e;
	 return OK;  
  } 
  
  //出栈操作
  Status Pop(SqStack &S, char &e)
{
  	//弹出栈顶元素, 不修改栈顶元素
	if(S.top == S.base)
	  	return ERROR;
	e = *--S.top;
	return OK; 
} 


   
   //判断输入的字符是否为数字 
int  In(char ch)
{
	switch(ch){
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
		case ')':
		case '#':
			return 1;
		
		default:
			return 0;
	}

}


//弹出栈顶元素
char GetTop(SqStack S)
{
	//返回栈顶元素, 不修改栈顶指针
	if(S.top != S.base)
		return *(S.top-1); 
} 


//判断运算符的优先级
Status Precede(char cd, char ch)
{
	int i, j;
	char pre[7][7] = {  ///优先级表 
	//    +    -    *    /    (    )    #	
		{'>', '>', '<', '<', '<', '>', '>'},  //  +
		{'>', '>', '<', '<', '<', '>', '>'},  //   -
		{'>', '>', '>', '>', '<', '>', '>'},  //   *
		{'>', '>', '>', '>', '<', '>', '>'},  //   /
		{'<', '<', '<', '<', '<', '=', '0'},  //  (
		{'>', '>', '>', '>', '0', '>', '>'},  //   )
		{'<', '<', '<', '<', '<', '0', '='}  //    #
	};
		
	switch(cd){
		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(ch){
		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 pre[i][j];
} 
 
 //进行二元运算
 char Operate(char a, char theta, char b)
 {

 	
 	switch(theta){
	 	case '+':
	 		return a+b;
	 		break;
 		case '-':
 			return a-b;
 			break;
		case '*':
			return a*b;
			break;
		case '/':
			if(b!='0'){
				return a/b;
				break;
			}
			else{
				cout<<"Divisor can not be 0!";
				break;
			}
				
				
	 }
 
 } 
 
 //数字转化 
 int number(char ch)
 {
 	return (int)(ch-'0');
 }
 
 
 //进行运算操作 
char  EvaluateExpression()
 {
 	SqStack OPND;   //寄存操作数 
 	SqStack OPTR;   // 寄存运算符 
 	char a, b;
 	char theta, x;  //接收弹出栈的字符 
 	InitStack(OPND);  //初始化OPND栈 
 	InitStack(OPTR);  //初始化OPTR栈
	Push(OPTR, '#');  ///因为已经压入#,所以输入时不用在输入#
	char ch;
	cout<<"请开始输入:"<<endl;
	cin>>ch;
	
	while(ch!='#' || GetTop(OPTR)!='#'){  //输入#结束输入
		if(!In(ch)){
			int k;
			k = number(ch);  //如果是数字的话就进行转换 
			Push(OPND, k);  //是数字就压入操作数栈 
			cout<<"请开始输入:"<<endl;
			cin>>ch;
		}
		else
			switch(Precede(GetTop(OPTR), ch))
			{
				case '<':
					Push(OPTR, ch);
					cout<<"请开始输入:"<<endl;
					cin>>ch;
					break;
				case '>':
					Pop(OPTR, theta);
					Pop(OPND, b); Pop(OPND, a);
					Push(OPND, Operate(a, theta, b));
					break;
				case '=':
					Pop(OPTR, x);
					cout<<"请开始输入:"<<endl;
					cin>>ch;
					break;
			}
	}  
	
	return GetTop(OPND);   
 }
 
 int main()
 {
	 int a;
 	a = EvaluateExpression();
 	printf("%d", a);
 	return 0;
 }
 

测试结果

测试数据:#2*(3+4)-6/3#

测试结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值