数据结构运算符作业

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值