标题:[求助]算术表达式求值演示
只看楼主
HELLO0
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-19
 问题点数:0 回复次数:2 
[求助]算术表达式求值演示
1.表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。(要求能在TC上运行的!!)急用,望各位高手帮忙!!

[此贴子已经被作者于2006-6-19 20:41:21编辑过]


搜索更多相关主题的帖子: 算术 求值 演示 表达 
2006-06-19 20:31
我要学数据结构
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-6-19
得分:0 

汗!
刚来,不会


2006-06-19 20:44
laozhangbao
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-10-17
得分:0 
#include<malloc.h>
#include<stdio.h>
#include<process.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
 
//typedef char SElemType;//
//typedef char Status;//
 
struct SqStack{
    int *base;
    int *top;
    int stacksize;
};
 
 
int InitStack(SqStack &S){
    S.base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
    if(!S.base) return ERROR;
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
 
 
int Push(SqStack &S,char e){
    if(S.top-S.base>=S.stacksize){
        S.base = (int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
        if(!S.base)exit(0);
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return OK;
}
 
 
int Pop(SqStack &S,char &e){
    if(S.top == S.base) return ERROR;
     e=*--S.top;
     return OK;
}
 
int GetTop(SqStack S){
    char e;
    if(S.top == S.base) return ERROR;
    e = *--S.top;
    return e;
}
 
int Transfor(char c)
{    //返回字符c对应优先关系表中的行列号
  int k;
  switch(c)
     {   
 case '+':k=0;break;
 case '-':k=1;break;
 case '*':k=2;break;
 case '/':k=3;break;
 case '(':k=4;break;
 case ')':k=5;break;
 case '#':k=6;break;
     }
  return k;
}
 
 
char JudgePrecede(char c1,char c2){
    //优先级判断
 
int i,j;
char pre[7][7]={{'>','>','<','<','<','>','>'},
                {'>','>','<','<','<','>','>'},
                {'>','>','>','>','<','>','>'},
                {'>','>','>','>','<','>','>'},
                {'<','<','<','<','<','=',' '},
                {'>','>','>','>',' ','>','>'},
                {'<','<','<','<','<',' ','='}
            };
 
        i=Transfor(c1);
        j=Transfor(c2);
        return(pre[i][j]);
}
 
 
int IfOperator(char c){
    //判断c是否为运算符
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
    {
        return(1);
    }
    else
    {
        return(0);
    }
}
 
char Operate(char a,char theta,char b)
{
char c;
a=a-48;
b=b-48;
switch(theta)
{
case'+':c=a+b+48;break;
case'-':c=a-b+48;break;
case'*':c=a*b+48;break;
case'/':c=a/b+48;break;
 
}
return c;
}
 
 
char EvaluateExpression(){
    SqStack OPTR,OPND;
    char a,b,c,x,theta;
    InitStack(OPTR);  
    Push(OPTR,'#');
    InitStack(OPND);  
    c=getchar();
    while(c!='#'||GetTop(OPTR)!='#'){
        if(!IfOperator(c))
        {
            Push(OPND,c);
            c=getchar();
        }
        else
            switch(JudgePrecede(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));break;
        }
    }
    return GetTop(OPND);
}
 
void main()
{
printf("请输入算术表达式(中间值及最终结果要在0~9之间),并以#结束\n");
printf("%c\n",EvaluateExpression());
}  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2009-10-19 22:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-73449-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.111353 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved