//思路:
//规定运算符的优先级(设置一个最低优先级的标志'#')
//设定两个栈:OVS(运算数栈),OPTR(运算符栈),首先令'#'入OPTR栈
//自左向右扫描,处理如下:
// 遇到运算数,进ovs栈
// 遇到运算符,与OPTR栈顶元素比较,若前者比后者优先级高,则运算符进栈
// 若前者比后者优先级低,OVS退栈两次,OPTR退栈一次,进行相应运算,得数入OVS栈
// 遇到结尾的标志‘#’,则以后的扫描都停留在此位置。当OPTR栈顶元素为'#'时结束循环
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 100
#define TRUE 1
#define FALSE 0
typedef struct
{
char optr[N/2];
int top;
}OPTR;//运算符栈
typedef struct
{
double ovs[N/2];//大约一个运算符对应一个运算数
int top;
}OVS;//运算数栈
int PushStack1(OPTR *s1,char ch)//入运算符栈
{
if(s1->top==N/3)
return FALSE;
s1->optr[++s1->top]=ch;
return TRUE;
}
int PushStack2(OVS *s2,double ch)//入运算数栈
{
if(s2->top==N*2/3)
return FALSE;
s2->ovs[++s2->top]=ch;
return TRUE;
}
int PopStack1(OPTR *s1,char