[求助]用堆栈做四则运算(实在没弄出来,郁闷惨了)
devoc 2007-04-03 10:53:40 基本思想是
为实现算符优先法,可以使用两个工作栈,一个是OPTR,用来寄存运算符,一个是OPND,用来寄存操作数和运算结果。首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素。然后依次读入表达式中的每个字符,若是操作数则入OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先关系,若高于栈顶运算符,则入栈,若等于则栈顶元素出栈,若低于栈顶运算符,则栈顶元素出栈后作相应运算,然后将运算结果入操作数栈,直至整个表达式求值完毕。(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。
而我的部分代码如下:
引入了两个头文件 Stack.h和Link.h
==============================
#include "Stack.h"
#include "Link.h"
template <class Elem> class LStack: public Stack<Elem>
{
private:
Link<Elem>* top;
int size;
public:
LStack(int sz =20)
{
top=NULL;
size=0;
}
~LStack() {clear();}
void clear()
{
while(top!=NULL)
{
Link<Elem>* temp=top;
top=top->next;
size=0;
delete temp;
}
}
bool push(const Elem& item)
{
top=new Link<Elem>(item,top);
size++;
return true;
}
bool pop(Elem& it)
{
if (size == 0)
return false;
it=top->element;
Link<Elem>*ltemp=top->next;
delete top;
top=ltemp;
size--;
return true;
}
bool topValue(Elem& it) const
{
if (size==0)
return false;
it=top->element;
return true;
}
char gettop()
{
return top->element;
}
int length() const {return size;}
};
================================
主程序是
#include <iostream>
#include<math.h>
#include "LStack.h"
using namespace std;
int precede(char c)
{
if(c==')')
return 3;
if(c=='+'||c=='-')
return 2;
if(c=='*'||c=='/')
return 1;
else
return 0;
}
int operate(int a,char b,int c)
{
int mul;
switch(char b)
{
case'+':mul=a+c;break;
case'-':mul=a-c;break;
case'*':mul=a*c;break;
case'/':mul=a/c;break;
}
return mul;
}
int main()
{
char t,c,q,ope;
int n,x,tem1,tem2,myop;
LStack <char> OPTR; //运算符栈
LStack<int> OPND; //数据栈
OPTR.push('#');
cout<<"请输入等式: 以#号结束"<<endl;
c=getchar();
while(c!='#'||OPTR.gettop()!='#')
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
{
if(precede(OPTR.gettop())<precede(c))
{
OPTR.push(c);
c=getchar();
}
else
{
OPTR.pop(ope);
cout<<ope;
OPND.pop(tem1);
OPND.pop(tem2);
myop=operate(tem1,ope,tem2); //做运算
OPND.push(myop);
OPTR.push(c);//把运算符优先级高的压入栈
c=getchar();
}
}
else
{
OPND.push(c);
c=getchar();
}
}
return OPND.gettop();
}
==================
觉得思路是对的
但怎么就一直弄不出来呢
哎,,都憋了一下午了
请高手指导指导.....