数据结构运算符作业

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NULL 0
#define OK 1
#define ERROR -1
#define STACK_SIZE 100
#define STACKsize 20
/*定义字符类型栈*/
typedef struct{
 int stacksize;
 char *base;
 char *top;

}Stack;
/*定义整数栈*/
typedef struct{
 int stacksize;
 int *base;
 int *top;
}Stack2;
/*-----全局变量-----*/
Stack OPTR;   //定义运算符栈
Stack2 OPND;   //定义操作数栈
char expr[255]="";//存放表达式串
char *ptr=expr;


int InitStack(Stack *s)//构造运算符栈
{
 s->base=(char *)malloc(STACK_SIZE*sizeof(char));
 if(!s->base)return ERROR;
 s->top=s->base;
 s->stacksize=STACKsize;
 return OK;
}
int InitStack2(Stack2 *s)//构造操作数栈
{
 s->base=(int *)malloc(STACKsize*sizeof(int));
 if(!s->base)return ERROR;
 s->stacksize=STACKsize;
 s->top=s->base;
 return OK;
}
int In(char ch) //判断字符是否是运算符,运算符返回1
{
 return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
int Push(Stack *s,char ch)//运算符栈插入ch为新的栈顶元素
{
 *s->top=ch;
 s->top++;
 return 0;
}
int Push2(Stack2 *s,int ch)//操作数栈插入新的栈顶元素
{
 *s->top=ch;
 s->top++;
 return 0;
}
char Pop(Stack *s)//删除运算符栈s的栈顶元素,用p返回其值
{
 char p;
 s->top--;
 p=*s->top;
 return p;
}
int Pop2(Stack2 *s)//删除操作数栈s的栈顶元素,用p返回其值
{
 int p;
 s->top--;
 p=*s->top;
 return p;
}
char GetTop(Stack s)//用p返回运算符栈s的栈顶元素
{
 char p=*(s.top-1);
 return p;
}
int GetTop2(Stack2 s)//用p返回操作符栈s的栈顶元素
{
 int p=*(s.top-1);
 return p;
}
/*判断运算符优先权,返回优先权高的*/
char Precede(char c1,char c2)
{
 int i=0,j=0;
 static char array[49]={
  '>','>','<','<','<','>','>',
  '>','>','<','<','<','>','>',
  '>','>','>','>','<','>','>',
  '>','>','>','>','<','>','>',
  '<','<','<','<','<','=','!',
  '>','>','>','>','!','>','>',
  '<','<','<','<','<','!','='
 };
 switch(c1)
 {
  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(c2)
 {
  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;

 }
 return(array[7*i+j]);//返回运算符
}
int Operate(int a,char op,int b)
{
 switch(op)
 {
 case'+':return(a+b);
 case'-':return(a-b);
 case'*':return(a*b);
 case'/':return(a/b);
 }
 return 0;
}
int num(int n)//返回操作数的长度
{
 char p[10];
 itoa(n,p,10);//把整型转换成字符串型
 n=strlen(p);
 return n;
}
int EvalExpr()//主要操作函数
{
 char c,theta,x;
 int n,m;
 int a,b;
 c=*ptr++;
 while(c!='#'||GetTop(OPTR)!='#')
 {
  if(!In(c))
  {
   if(!In(*(ptr-1)))
    ptr=ptr-1;
   m=atoi(ptr);//取字符前面的数字段
   n=num(m);
   Push2(&OPND,m);
   ptr=ptr+n;
   c=*ptr++;
  }
  else
  {
   switch(Precede(GetTop(OPTR),c))
   {
    case'<':
     Push(&OPTR,c);
     c=*ptr++;
     break;
    case'=':
     x=Pop(&OPTR);
     c=*ptr++;
     break;
    case'>':
     theta=Pop(&OPTR);
     b=Pop2(&OPND);
     a=Pop2(&OPND);
     Push2(&OPND,Operate(a,theta,b));
     break;
   }

  }
  
 }
 return GetTop2(OPND);
 
}
int main()
{
 printf("输出以#为结尾的正确表达式:");
 do
 {
  gets(expr);
 }while(!*expr);
 InitStack(&OPTR);//初始化运算符栈
 Push(&OPTR,'#');//将#压入运算符栈
 InitStack2(&OPND);//初始化操作数栈
 printf("表达式结果为:%d\n",EvalExpr());
 system("pause");
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值