【数据结构】book3_3 表达式求值
#include<iostream>
#include <stdlib.h>
using namespace std; typedef int Status;
const int TRUE=;
const int FALSE=;
const int OK=;
const int ERROR=;
const int INFEASIBLE=-;
const int overflow=-;
const int STACK_INIT_SIZE=;
const int STACKINCREMENT=; typedef struct{
char *base;
char *top;
int stacksize;
}SqStack; //构造一个空栈
Status InitStack(SqStack &S)
{
S.base=(char*)malloc(sizeof(char)*STACK_INIT_SIZE);
if(!S.base) exit(overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
} Status GetTop(SqStack S,char &e)
{
if(S.top==S.base) return ERROR;
e=*(S.top-);
return OK;
} Status Push(SqStack &S,char e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(overflow);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
} Status Pop(SqStack &S,char &e)
{
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
} Status StackEmpty(SqStack S){
if(S.base==S.top)
return TRUE;
else
return FALSE;
} Status ClearStack(SqStack &S)
{
S.top = S.base ;
return TRUE;
} Status DestroyStack(SqStack &S)
{
if(S.base!=NULL)
{
free(S.base);
S.stacksize=;
S.top=NULL;
}
return TRUE;
}
#include"book3_3.h" #define ND 0 //操作数标志
#define TR 1 //操作符标志 //存放运算符的优先顺序的矩阵 op1是竖排的 op2是横排的 e表示错误
const static char Order[][]=
{{'>','>','<','<','<','>','>'}, // +
{'>','>','<','<','<','>','>'}, // -
{'>','>','>','>','<','>','>'}, // *
{'>','>','>','>','<','>','>'}, // /
{'<','<','<','<','<','=','e'}, // (
{'>','>','>','>','e','>','>'}, // )
{'<','<','<','<','<','e','='}}; // #
// + - * / ( ) # //比较两个操作符的优先级 op1和op2的顺序不能错
Status compOperator(char op1, char op2, char &result)
{
int t1=,t2=;
//找到两个操作符的优先级在矩阵中的位置
switch(op1)
{
case '+': t1=; break;
case '-': t1=; break;
case '*': t1=; break;
case '/': t1=; break;
case '(': t1=; break;
case ')': t1=; break;
case '#': t1=; break;
default: return ERROR; break;
}
switch(op2)
{
case '+': t2=; break;
case '-': t2=; break;
case '*': t2=; break;
case '/': t2=; break;
case '(': t2=; break;
case ')': t2=; break;
case '#': t2=; break;
default: return ERROR; break;
} result=Order[t1][t2]; if(result=='e')
return ERROR;
else
return OK;
} int decideNDorTR(char t) //判断输入的字符是操作符还是操作数
{
if(t>=&&t<=) //数字的ascii码范围
{
return ND;
}
else if(t=='+' || t=='-' || t=='*' || t=='/' || t=='(' || t==')' || t=='#')
{
return TR;
}
else
{
printf("error");
return ERROR;
} } char myCalculate(char op,char num1,char num2) //字符型的运算符的计算
{
char num;
switch(op)
{
case '+': num= num1+ num2; break;
case '-': num= num1- num2; break;
case '*': num= num1* num2; break;
case '/': num= num1/ num2; break;
default: printf("error");break;
}
return num;
} //计算表达式的函数 注意运算结果大小不能超过255 char型
char EvaluateExpression(char *p, int length)
{
SqStack OPTR, OPND;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#'); while(*p != '\0')
{
char t = *(p++);
int ND_TR=decideNDorTR(t); //判断是操作符 还是 操作数 if(ND_TR == ND) //操作数
{
//操作数有可能是多位的
char num=;
while(t>=&&t<=) //字符 0-9
{
num = num * + t - ;
t=*(p++);
}
p--; //对于 12+3 这样的情况 在取完数后 p=3 +被取走了 需要退一个 把操作符还回去
Push(OPND,num);
}
else if(ND_TR == TR) //操作符
{
char order;
char op1;
char op2= t;
GetTop(OPTR,op1);
compOperator(op1, op2, order);
switch(order)
{
case '>': //若栈中的操作符优先级高 则取出操作数的前两个做运算 把运算后的操作符弹出 运算结果压入
{
char num1,num2,num;
char tmp;
Pop(OPND,num2);
Pop(OPND,num1);
num = myCalculate(op1,num1,num2);
Push(OPND,num);
Pop(OPTR,tmp);
p--; //这里p要退回 让op2再进行新一轮判断
break;
}
case '<': //若栈中操作符优先级低 新操作符进栈
{
Push(OPTR,op2);
break;
}
case '=': //()或# 弹出 脱括号
{
char tmp;
Pop(OPTR,tmp); break;
}
default:
{
break;
}
}
} }
char e;
GetTop(OPND,e);
return e; } void main()
{
char p[]="(11+2)*3-28+123-52#";
char ans;
ans = EvaluateExpression(p, );
printf("%d",ans);
getchar(); }
写了好半天啊 关系总是理不清楚的感觉
【数据结构】book3_3 表达式求值的更多相关文章
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
		
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
 - C++表达式求值(利用数据结构栈)
		
唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的 ...
 - 表达式求值--数据结构C语言算法实现
		
这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...
 - 数据结构--栈的应用(表达式求值 nyoj 35)
		
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
 - 数据结构课程设计四则运算表达式求值(C语言版)
		
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
 - 用Python3实现表达式求值
		
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
 - NYOJ    1272    表达式求值  第九届省赛  (字符串处理)
		
title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...
 - [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
		
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
 - LeetCode150 逆波兰表达式求值
		
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
 
随机推荐
- WCF服务显示的是服务器名称而不是IP地址...
			
打开http://xx.xx.xx.xx:端口号/Service1.svc页面显示的服务地址为: http://xx_yy_server:端口号/Service1.svc?wsdl 是显示的服务器的名 ...
 - 可编辑select
			
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
 - AlwaysOn可用性组功能测试(一)--AlwaysOn故障转移测试
			
具体测试环境请参考: AlwaysOn可用性组测试环境安装与配置(一)--SQL群集环境搭建 AlwaysOn可用性组测试环境安装与配置(二)--AlwaysOn配置(界面与T-SQL) 一. Alw ...
 - nyoj 4  779 兰州烧饼
			
兰州烧饼 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 烧饼有两面,要做好一个兰州烧饼,要两面都弄热.当然,一次只能弄一个的话,效率就太低了.有这么一个大平底锅,一 ...
 - svg技术(可缩放矢量图形)介绍
			
公司里面的产品用图表的地方也比较多,作为平台维护的我,收到几次需求提的建议中包括图表美化的功能,要炫,要3d,立体感,功能要强大等到:平台现有控件都是用的一个开源flash,我对flash虽然会一点但 ...
 - mysql explain 中key_len的计算
			
今天丁原问我mysql执行计划中的key_len是怎么计算得到的,当时还没有注意,在高性能的那本书讲到过这个值的计算,但是自己看执行计划的时候一直都没有太在意这个值,更不用说深讨这个值的计算了: ke ...
 - Java连接池详解
			
于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配﹑释放所造成的问题.为解决我们的问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为数 ...
 - 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用
			
点击(此处)折叠或打开 --在sal列上创建非唯一索引 scott@TESTDB11>create index idx_emp1_sal on emp1(sal); Index created. ...
 - centos安装
			
转:http://www.cnblogs.com/Johness/archive/2012/12/03/2800126.html 在已经安装了Win7的系统下安装CentOS 注意:1.由于涉及到对硬 ...
 - PHPCMS调用form类编辑器editor函数动态上传图片附件
			
http://w3note.com/web/49.html phpcms v9的系统类库有一个表单类,它封装了表单的一些组件,如编辑器.图片上传.时间选择器.模板选 择器等,更详细请参考form.cl ...