这是数据结构里堆栈的一个典型算法,自己可以找那些书看看.
你的思路不错,不过没必要OperPriStack,OperateStack就足够了,这里假设你只用四则运算法则,括号也不讨论,当输入的是加、减就压到OperateStack去,是乘、除就取出OperandStack里的两个数进行运算,按你的要求是哪两个数进行运算需要另外保存,书上的那个例题好象就不保存的。

解决方案 »

  1.   

    我以+和*为例对两个栈都先压入一个特殊字符——象‘@’
    对数字的处理,按字符输入,判断是否为符号,若不是,字符转化为数字(atoi()函数),TEMP*10再加上你刚才输入的数(TEMP初始化为0);若为符号,判断栈中第一个符号是否为‘@’,若是,两种情况:1,数字栈中已经有两个数,那么直接运算(这可以来作为最后一步运算的判断);2,数字栈中只有一个数,继续输入数;若不为‘@’,判断运算符优先级,同级则符号入栈,数入栈,继续输入,继续判断,若优先级较高的,则数字栈POP出两数,参与运算,结果再入栈。继续……可能讲得不明白,哪里不懂可以再问
      

  2.   

    谢谢,我明白你的意思,其实还有一个问题需要考虑。例如:3+2*4+7-6。我需要保存*OperateStack.top,取出OperandStack.top-1,OperandStack.top+1,然后将8压栈,这样简化为3+8+7-...,点击等号后,依次弹出操作数,和操作符,运算。其实,这能做到乘除法的分布动态结果显示,加减法做到动态显示我就不知道该如何处理了。
      

  3.   

    我刚弄完一个dos版的,并没有分步计算的能力,当然要实现并不困难
    这是伪代码:
    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来运算
    我觉得难点不是这里,而是如何确定算符合对象,并进行适当的错误检查
    有什么不对的以后再讨论吧
      

  4.   

    噢,搞定,我完全明白,比较优先级,如果相等3+4+2,前两数弹栈,运算。若不相等,3+4*2+...比较OperPriStack.(top-1)和OperPriStack.(top-2),然后弹出4 2 *,计算后压栈,分情况来讨论。
    谢谢各位的指点。现在结贴,散分了!!!
      

  5.   

    我想困难的地方是对数据的判断和错误的检查
    推荐使用double atof(char *)来进行转换
    我想应该统一的建立一个数据结构:
    typedef struct Operate
    {
    int isp;
    int icp;
    };typedef sturct data
    {
    double Operand;
    struct Operate;
    int flag;
    struct data *next;
    }Data,Dataptr;
      

  6.   

    to weakpig(虚弱的猪) :实在不好意思,结贴时,没有刷新,我没看到你的恢复,没给你送上分,真的非常抱歉