从璞石到玉的个人空间 https://blog.eetop.cn/liuyang [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

小发一个表达式求值的c语言实现

已有 2719 次阅读| 2006-12-6 15:22 |个人分类:数据结构

天气: 冷
心情: 高兴

main.cpp:

#include<stdio.h>
#include<stdlib.h>
#include"defination.h"
#include"function.h"

 

void main(void)
{
 sqstack OPTR,OPND;    //OPTR、OPND分别表示运算符栈与运算数栈
 ElemType a,b,c,x;
 initstack(&OPTR);
 initstack(&OPND);
 push(&OPTR,'\n');

 printf("请输入算术表达式(输入的值在0~9之间):");
 c=getchar();
 gettop(&OPTR,&x);
 while(c!='\n'||x!='\n')
 {
  if(in(c))
   switch(precede(x,c))
  {
   case '<':  push(&OPTR,c);
              c=getchar();
        break;
   case '=':  pop(&OPTR,&x);
           c=getchar();
        break;
   case '>':  pop(&OPTR,&x);
           pop(&OPND,&b);
        pop(&OPND,&a);
        push(&OPND,operate(a,x,b));
        break;
  }
  else if(c>='0'&&c<='9')
  {
   push(&OPND,c-48);
   c=getchar();
  }
  else
  {
   printf("出现非法字符!!!");
   exit(0);
  }
  gettop(&OPTR,&x);
 }
 pop(&OPND,&a);
 if(!stackempty(&OPND))
  {
   printf("表达式不正确!!!");
   exit(0);
  }
        printf("%d\n",a);
}



defination.h:
#define INITSIZE 100

typedef char ElemType;
typedef struct
{
 int        top;
 ElemType   *base;
 int        stacksize;
}sqstack;


functions.h:

void initstack(sqstack *s)           //创建空栈
{  
 s->base=(ElemType *)malloc(INITSIZE*sizeof(ElemType));
 s->top=0;
 s->stacksize=INITSIZE;
}

 


int push(sqstack *s,ElemType x)       //把元素入栈
{
 s->base[s->top++]=x;
 return 1;
}

 


int pop(sqstack *s,ElemType *e)      //元素出栈
{
 if(s->top==0)  return 0;
 else
  *e=s->base[--s->top];
 return *e;
}

 

int stackempty(sqstack *s)            //判断栈空
{
 if(s->top==0)     return 1;
 else             return 0;
}

 


int gettop(sqstack *s,ElemType *e)    //e返回是s的栈顶元素
{
 if(s->top>0)
 {
  *e=s->base[s->top-1];
  return 1;
 }
 else
  return 0;
}

 

 

int in(char c)                            // 判断c是否为7种运算符之一
{
 switch(c)
 {
     case '+':
        case '-':
        case '*':
  case '/':
  case '(':
  case ')':
  case '\n':  return 1;
  default  :  return 0;
 }
}


 
char precede(char t1,char t2)             //    判断两字符的优先关系
{
 char f;
 switch(t2)
 {
     case '+':
  case '-':  if(t1=='('||t1=='\n')
        f='<';   //t1<t2
          else
        f='>';   //t1>t2
       break;
  case '*':
  case '/':  if(t1=='*'||t1=='/')
        f='>';    //t1>t2
     else
        f='<';   //t1<t2
     break;
        case '(':  if(t1==')')
       {
        printf("括号内无数值!!!");
        exit(0);
       }
          else
        f='<';     //t1<t2
       break;
  case ')':  switch(t1)
       {
        case '(': f='=';   //t1=t2
               break;
                       case '\n': printf("括号不匹配!!!");
                exit(0);
        default  : f='>';  //t1>t2
       }
   break;
  
        case '\n': switch (t1)
       {
        case '\n': f='=';  //t1=t2
                break;
        case '(':  printf("括号不匹配!!!");
                exit(0);
        default :  f='>';  //t1>t2
       }
 }
 return f;
}

 

char operate(char a,char theta,char b)     //表达式求值
{
 switch(theta)
 {
    case '+' :return a+b;
    case '-' :return a-b;
    case '*' :return a*b;
    default  :return a/b;
 }
}


点赞

发表评论 评论 (1 个评论)

Guest 2007-5-13 11:19
hao

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 20

    评论
  • 208

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-10 14:09 , Processed in 0.022721 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部