这是数据结构里堆栈的一个典型算法,自己可以找那些书看看.
你的思路不错,不过没必要OperPriStack,OperateStack就足够了,这里假设你只用四则运算法则,括号也不讨论,当输入的是加、减就压到OperateStack去,是乘、除就取出OperandStack里的两个数进行运算,按你的要求是哪两个数进行运算需要另外保存,书上的那个例题好象就不保存的。
你的思路不错,不过没必要OperPriStack,OperateStack就足够了,这里假设你只用四则运算法则,括号也不讨论,当输入的是加、减就压到OperateStack去,是乘、除就取出OperandStack里的两个数进行运算,按你的要求是哪两个数进行运算需要另外保存,书上的那个例题好象就不保存的。
对数字的处理,按字符输入,判断是否为符号,若不是,字符转化为数字(atoi()函数),TEMP*10再加上你刚才输入的数(TEMP初始化为0);若为符号,判断栈中第一个符号是否为‘@’,若是,两种情况:1,数字栈中已经有两个数,那么直接运算(这可以来作为最后一步运算的判断);2,数字栈中只有一个数,继续输入数;若不为‘@’,判断运算符优先级,同级则符号入栈,数入栈,继续输入,继续判断,若优先级较高的,则数字栈POP出两数,参与运算,结果再入栈。继续……可能讲得不明白,哪里不懂可以再问
这是伪代码:
double evaluate(char exp[])
{/*开对象栈s1和算符栈s2,算符栈底置一‘(’*/
while(1)
{取单词x;
switch(x)
{
case x是对象:push(s1,x);break;
case x='(': 反复出栈处理;直到算符栈顶首次出现‘(’;删去‘(';break;
case x=';':反复出栈处理;直到算符栈只有‘(’;return 对象栈顶值;/*已计算完*/
case x 为其余算符:
while(x.icp<=s1[top].isp)
{出栈处理;}
push(s2,x);
}
先设定各算符的优先级,isp为栈内,icp为栈外
出栈处理时把对象栈从top读两个,用算符栈的top来运算
我觉得难点不是这里,而是如何确定算符合对象,并进行适当的错误检查
有什么不对的以后再讨论吧
谢谢各位的指点。现在结贴,散分了!!!
推荐使用double atof(char *)来进行转换
我想应该统一的建立一个数据结构:
typedef struct Operate
{
int isp;
int icp;
};typedef sturct data
{
double Operand;
struct Operate;
int flag;
struct data *next;
}Data,Dataptr;