linux算术表达式求值数据结构,算术表达式求值演示(C语言)

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

算术表达式求值演示(C语言)

/*

测试用例:演示用算符优先法演示对算术表达式求值的过程,主要对以下几个计算式进行演示:

8;1+2+3+4;88-1*5;1024/4*8;1024/(4*8);(20+2)*(6/2);

3-3-3;8/(9-8);2*(6+2*(3+6*(6+6)));(((6+6)*6+3)*2+6)*2

@Author:MJW

@学号:090502108

@班级:09信管1班

@完成时间:2010/12/22

*/

//头文件预处理命令

#include

#include

//----------函数结果状态代码-----------------

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

//----------定义函数类型,返回结果状态代码--------

typedef int Status;

//-----------定义栈的元素类型------------

typedef int ElemType;

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

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

//-----------顺序栈的定义,并定义栈顶和栈底元素-----------

typedef struct{

ElemType *base;

ElemType *top;

int stacksize;

}Stack;

//--------基本操作的函数原型说明-----------

Status IfEmptyStack(Stack S);

Status InitStack (Stack &S);

Status EmptyStackEmpty(Stack &S);

Status GetTop(Stack S,ElemType &e);

Status Push(Stack &S,ElemType e);

Status Pop(Stack &S,ElemType &e);

Status ShowStack(Stack S);

Status EvaluateExpression();

//-------------In函数-----------------

int In(char ch);

char Precede(char a, char b);//判定运算符栈的栈顶运算符i与读入的运算符j之间优先关系的函数

int Operate(int a, char f, int b);

//--------基本操作的算法描述---------------

Status IfEmptyStack(Stack S){

if(S.base==S.top)

return 1;

return 0;

}//IfEmptyStack

Status InitStack(Stack &S){

//构造一个空栈

S.base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));

if(!S.base)exit(OVERFLOW);//存储分配失败

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return 1;

}//InitStack

Status EmptyStack(Stack &S){

S.top=S.base;

return OK;

}//EmptyStack

Status GetTop(Stack S) {

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

ElemType e;

e=*(S.top-1);

return e;

}//GetTop

Status Push(Stack &S,ElemType e){

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

if(S.top-S.base>=S.stacksize){//若栈满,则追加存储空间

S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));

if(!S.base) exit (OVERFLOW);//存储分配失败

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

return OK;

}//Push

Status Pop(Stack &S,ElemType &e){

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

if(S.top==S.base) return ERROR;

e=*--S.top;

return OK;

}//Pop

Status ShowStack(Stack S){

ElemType *p=S.base;

while(p!=S.top)

printf("%d",*p++);

return 1;

}//ShowStack

int In(char ch){

int res;

switch(ch) {

case '+':

case '-':

case '*':

case '/':

case '(':

case ')':

case '#': res=1;break;

default: res=0;break;

}

return res;

}//In

char Precede(char a, char b){

int i,j;

int form[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}

};

switch(a) {

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(b) {

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;

}

if(form[i][j]==1)

return '>';//i的优先级高于j

else if(form[i][j])

return '

else

return '=';//i的优先级等于j

}//Precede

int Operate(int a, char f, int b){

switch(f) {

case '+': return a+b;

case '-': return a-b;

case '*': return a*b;

case '/': return a/b;

}

return 0;

}//Operate

//-------------核心算法-------------------------

Status EvaluateExpression(){

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

char c, d[100];

int i, f, num, tmpa, tmpb;

Stack OPTR, OPND;

InitStack(OPTR);InitStack(OPND);

Push(OPTR, '#');

c=getchar();

while(c!='#'||GetTop(OPTR)!='#') {

if(c>='0'&&c<='9')  {

i=0;

do{

d[i++]=c;

c=getchar();

}while(c>='0'&&c<='9');

d[i]='\0';

num=atoi(d);

Push(OPND, num);

}//if

else if(In(c))  {

switch(Precede(GetTop(OPTR), c)){

case '

Push(OPTR, (int)c);c=getchar();

break;

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

Pop(OPTR, f);c=getchar();

break;

case '>': //退栈并将运算结果入栈

Pop(OPTR, f);

Pop(OPND, tmpb); Pop(OPND, tmpa);

Push(OPND, Operate(tmpa, f, tmpb));

break;

}//switch

}//else if

}//while

c=getchar();//接收最后输入的一个回车符!!!否则在主函数中只能输入一次...

printf("所求表达式的值为:");

ShowStack(OPND);

printf("\n");

return 1;

}//EvaluateExpression

//-----------------主函数---------------------------

int main(){

system("color 69");//设置控制台背景及前景颜色

printf("\n\n\n");

printf("                         数据结构课程设计      \n\n");

printf("             ★★★★★★★★★★★★★★★★★★★★★\n");

printf("                                                     \n");

printf("                 演示课题:   算术表达式求值演示     \n");

printf("                                                     \n");

printf("                 姓名学号:   MJW 090502108          \n");

printf("                                                     \n");

printf("                 所在班级:   09信息管理1班          \n");

printf("                                                     \n");

printf("             ★★★★★★★★★★★★★★★★★★★★★\n");

printf("请输入表达式,以 # 结束...\n");

//循环输入表达式,用while语句

while(1) {

EvaluateExpression();

printf("请再输入表达式,以 # 结束...\n");

}//while

return 0;

}//main

搜索更多相关主题的帖子:

C语言 表达式 时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值