表达式求值问题的计算/eg.3*9/5(2-11)

zbstone 2002-05-19 10:52:12
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define TURE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态的代码
typedef int Status;

//使用两个栈来分别存放操作数和操作符

//2.5 算术表达式求值演示

//参考教科书中P52 3.2.5 表达式求值

//栈的表示与实现参照教科书中P46 - 47

//======== ADT Stack 的表示与实现 =========


//-------- 栈的顺序存储表示 ---------


#define STACK_INIT_SIZE 100; //存储空间初始分配量
#define STACKINCREMENT 10; //存储空间分配增量

typedef struct {
int * base;
int * top;
int stacksize;
}SqStack;

//-------基本操作的函数原型说明---------
Status InitStack(SqStack &S);
//构造一个空栈
Status DestroyStack(SqStack &S);
//销毁栈S,S不再存在
Status ClearStack(SqStack &S);
//把S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TURE,否则返回FLASE
int StackLength(SqStack S);
//返回S的元素个数,即栈的长度
Status GetTop(SqStack S,int &e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(SqStack &S,int &e);
//插入元素e为新的栈顶元素
Status Pop(SqStack &S,int &e);
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(SqStack S,Status(* visit)());
//从栈底到栈顶依次对栈中的每个元素调用函数visit().一旦visit()失败,则操作失败


//----------基本操作的算法描述-------------
Status InitStack(SqStack &S){
//构造一个空栈
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) return(OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}// InitStack

Status DestroyStack(SqStack &S){
//销毁栈S,S不再存在
}

Status ClearStack(SqStack &S){
//把S置为空栈
}

Status StackEmpty(SqStack S){
//若栈S为空栈,则返回TURE,否则返回FLASE
}

int StackLength(SqStack S){
//返回S的元素个数,即栈的长度
}

Status GetTop(SqStack S,int &e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}//GetTop

Status Push(SqStack &S,int &e){
//插入元素e为新的栈顶元素
if(S.top - S.base >= S.stacksize){//栈满,追加存储空间
S.base = (int *)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof (int));
if(!S.base) return(OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}//Push

Status Pop(SqStack &S,int &e){
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}//Pop

//以上的栈用来存放操作数,所以元素类型为 int

typedef struct {
char * base;
char * top;
int stacksize;
}SqStack;
//-------基本操作的函数原型说明---------
Status InitStack(SqStack &S);
//构造一个空栈
Status DestroyStack(SqStack &S);
//销毁栈S,S不再存在
Status ClearStack(SqStack &S);
//把S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TURE,否则返回FLASE
int StackLength(SqStack S);
//返回S的元素个数,即栈的长度
Status GetTop(SqStack S,char &e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(SqStack &S,char &e);
//插入元素e为新的栈顶元素
Status Pop(SqStack &S,char &e);
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(SqStack S,Status(* visit)());
//从栈底到栈顶依次对栈中的每个元素调用函数visit().一旦visit()失败,则操作失败


//----------基本操作的算法描述-------------
Status InitStack(SqStack &S){
//构造一个空栈
S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}// InitStack

Status DestroyStack(SqStack &S){
//销毁栈S,S不再存在
}

Status ClearStack(SqStack &S){
//把S置为空栈
}

Status StackEmpty(SqStack S){
//若栈S为空栈,则返回TURE,否则返回FLASE
}

int StackLength(SqStack S){
//返回S的元素个数,即栈的长度
}

Status GetTop(SqStack S,char &e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}//GetTop

Status Push(SqStack &S,char &e){
//插入元素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;
}//Push

Status Pop(SqStack &S,char &e){
//若栈不空,则删除栈的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}//Pop


char Precede(char cleft,char cright)
{
//判断运算符栈的栈顶运算符与读入运算符的优先关系
int r[2];
int jielun;
char csearch=cleft;
for(int i=0;i<2;i++)
{
if(i==1) csearch=cright;
switch(csearch){
case '+' :
r[i] = 0 ; break;
case '-' :
r[i] = 1 ; break;
case '*' :
r[i] = 2 ; break;
case '/' :
r[i] = 3 ; break;
case '(' :
r[i] = 4 ; break;
case ')' :
r[i] = 5 ; break;
case '#' :
r[i] = 6 ; break;
}
}
int bijiao[7][7]={{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
for (int j=0;j<7;j++)
for(int k=0;k<7;k++)
{
if(j==r[0]&&k==r[1])
{
jielun=bijiao[j][k];
break;
}
}
char jieguo;
switch(jielun){
case -1 : jieguo = '<' ; break;
case 0 : jieguo = '=' ; break;
case 1 : jieguo = '>' ; break;
case 2 : jieguo = ' ' ; break;
};

/*///////////////////////////

char jieguo1;
for (int j1=0;j1<7;j1++)
{
for(int k1=0;k1<7;k1++)
{
switch(bijiao[j1][k1]){
case -1 : jieguo1 = '<' ; break;
case 0 : jieguo1 = '=' ; break;
case 1 : jieguo1 = '>' ; break;
case 2 : jieguo1 = ' ' ; break;
};
cout<<jieguo1<<" ";
}
cout<<endl;
}
//////////////////////////*/

return jieguo;
}

int Operate(int operleft,char theta,int operright)
{
//此段程序用来计算结果
//传入的operleft与operright是字符型
//需要强制类型转换为整型
int result;
switch(theta){
case '+' : result=operleft + operright;break;
case '-' : result=operleft - operright;break;
case '*' : result=operleft * operright;break;
case '/' : result=operleft / operright;break;
}
return result;
}

OperandType EvaluateExpression() {
//算术表达式求值的算符优先算法.设OPTR和OPND分别为运算符栈和运算数栈
//OP为运算符集合
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;
case '=' : //脱括号并接收下一字符
Pop(OPTR,x); c = getchar();
break;
case '>' : //退栈并将运算结果入栈
Pop(OPTR,theta);
Pop(OPND,b); Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
}//switch
}//while
return GetTop(OPND);
}//EvaluateExpression

void main()
{
}
...全文
51 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbstone 2002-07-18
  • 打赏
  • 举报
回复
各位可以解释的清楚一点吗?
不需要很详细
就是要运要的库函数和作用说一下就行
程序就不需要了,因为我实习已经结束了,现在只是想把问题搞清楚点
潘李亮 2002-07-17
  • 打赏
  • 举报
回复
偶有一个程序,基本上能用了。
要就给你
Xheartblue@etang.com
ccmouse 2002-07-17
  • 打赏
  • 举报
回复
这个用stream比较方便。不然也只能一位位强行比较,然后用atoi,itoa
zbstone 2002-07-17
  • 打赏
  • 举报
回复
数据结构不是最关键的问题,主要在于动态处理字符(+,-,*,/,(,),)和数字(0,1,2,3,4,5,6,7,8,9,)因为在设置战的时候存储类型为char,所以不知道如何将一个串转为一个个字符保存,就是将数字串转换为数字的步骤如何实现。
duqiang2050 2002-07-17
  • 打赏
  • 举报
回复
用二叉树法做表达是分析~~数据结构树上都有
Davis_Dai 2002-07-17
  • 打赏
  • 举报
回复
清华数据结构的书上讲得很清楚啊
zbstone 2002-05-19
  • 打赏
  • 举报
回复
以上这段是拼凑的程序,还有不少的错误,我想解决的是一个数据结构的实习题目,想了半天了,还是不全明白,希望高手赐教!
[问题描述] 设计一个程序,演示用算符优先算法对算术表达式求值的过程
[要求]1基本上用C的语言风格编写,
2要设置栈存储结构,模拟算法的运算流程,并输出关键步骤
3输入整个表达式,输出计算结果
心急呀,各位高手,帮小弟一把~~

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧