| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3942 人关注过本帖
标题:谁能做表达式求值啊 求助!!!!!!!!!!!!!!
只看楼主 加入收藏
firel
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2007-10-4
收藏
 问题点数:0 回复次数:31 
谁能做表达式求值啊 求助!!!!!!!!!!!!!!
做了一个但怎么也出不来!!!!!!!!1

表达式求值.rar (1.48 KB)
搜索更多相关主题的帖子: 求值 表达 
2008-04-16 20:23
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
帮你看了一下,光眼看,看不出什么,我一直用C++来写这些,我用VS2008编译器,打不开你那个malloc文件.
你若想要一个C++写的,我可以写一个发上来。

i like linux...
2008-04-16 21:55
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
或者你可以BAIDU一下的,应该很多这方面的。

i like linux...
2008-04-16 22:04
firel
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2007-10-4
收藏
得分:0 
谢了兄弟
我一直都是用c没用过c++不过想试试看给我发一个把我看看谢了
2008-04-16 22:13
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
昨天写好了,调试到今天,晕。。。。。。。。。
我写得是后缀计算表达式,因为现在编译程序一般都是用后缀表达式求解表达式的值。
我用VS2008编译器,经测试通过。如果有什么问题,望告诉一声,谢谢。
我用多文件形势写出来,包含:
栈类"Stack.h","Stack.cpp"
表达式类:"Calculator.h","Calculator.cpp"
还有一个"main.cpp"
大部分程序都有注释,如有不懂,再交流。。

i like linux...
2008-04-18 11:31
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
//Stack.h

#ifndef STACK_H
#define STACK_H
typedef double DataType;
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxStackSize=50;
class Stack
{
private:
    DataType stacklist[MaxStackSize];
    int top;
public:
    Stack();
    void Push(const DataType& item);                //压入操作
    DataType Pop();                                 //弹出一个元素
    void ClearStack();                              //清空栈
    DataType Peek()const;                           //访问栈顶元素
    int StackEmpty()const;                          //查看是否为空栈
    int StackFull()const;                           //查看是否已满
};
#endif

i like linux...
2008-04-18 11:32
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
//Stack.cpp

#include "Stack.h"
Stack::Stack():top(-1){}
void Stack::Push(const DataType& item)
{
    //若栈已满,则终止程序
    if(top==MaxStackSize-1)
    {
        cerr<<"Stack overflow!"<<endl;
        exit(1);
    }
        //将top加一并将ITEM拷贝到STACKLIST中
    top++;
    stacklist[top]=item;
}
DataType Stack::Pop()
{
    DataType temp;
    if(top==-1)                         //栈为空,退出
    {
        cerr<<"Attemp to pop an empty stack!"<<endl;
        exit(1);
    }
    temp=stacklist[top];                  //将栈顶元素赋给temp;
    //top减一并返回temp
    top--;
    return temp;
}
DataType Stack::Peek()const               //返回栈顶元素的值
{
    //若栈为空,退出
    if(top==-1)
    {
        cerr<<"Attemp to peek t an empty stack!"<<endl;
        exit(1);
    }
    return stacklist[top];
}
int Stack::StackEmpty()const              //检测栈是否为空
{
    return top==-1;                       //返回top==-1的逻辑值
}
int Stack::StackFull()const              //检测栈是否为满
{
    //检测top的位置
    return top==MaxStackSize-1;
}
void Stack::ClearStack()                   //从栈中清除所有元素
{
    top=-1;
}

i like linux...
2008-04-18 11:32
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
//Calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H
enum Boolean{False,True};

#include "Stack.h"
#include <cmath>
class Calculator
{
private:
    Stack s;                                      //存放操作数
    void Enter(double num);
    Boolean GetTwoOperands(double& opnd1,double &opnd2);
    void Compute(char op);
public:
    
    void Run();                                //计算表达式
    void Clear();                              //清空计算器
};
#endif

i like linux...
2008-04-18 11:33
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
//Calculator.cpp


#include "Calculator.h"

void Calculator::Enter(double num)             //住栈中存放数据值
{
    s.Push(num);
}
//从栈中取得操作数并赋值给形参,若操作数不够,则打印出错信息,并返回False
Boolean Calculator::GetTwoOperands(double& opnd1,double& opnd2)
{
    if(s.StackEmpty())                         //检查操作数是否存在
    {
        cerr<<"Missing operand!"<<endl;
        return False;
    }
    opnd1=s.Pop();                               //取右操作数
    if(s.StackEmpty())
    {
        cerr<<"Missing operand!"<<endl;
        return False;
    }
    opnd2=s.Pop();                               //取左操作数
    return True;
}
void Calculator::Compute(char op)
{
    Boolean result;
    double operand1,operand2;
    //取两个操作数,并判断是否成功取到
    result=GetTwoOperands(operand1,operand2);
    if(result==True)
        switch(op)
    {
        case '+':
            s.Push(operand2+operand1);
            break;
        case '-':
            s.Push(operand2-operand1);
            break;
        case '*':
            s.Push(operand2*operand1);
            break;
        case '/':
            if(operand1==0.0)
            {
                cerr<<"Divide by 0!"<<endl;
                s.ClearStack();
            }
            else
                s.Push(operand2/operand1);
            break;
        case '^':
            s.Push(pow(operand2,operand1));
            break;
    }
    else
        s.ClearStack();                       //出错!清空计算器
}
void Calculator::Run()
{
    char c;
    double newoperand;
    while(cin>>c&&c!='=')                           //读入字符,直到遇“=”时退出
    {
        switch(c)
        {
        case '+':
        case '-':
        case '*':
        case '/':
        case '^':
            Compute(c);                        //读到运算符,求值
            break;
        default:
            //非运算符,则必为操作数,将数字送回
            cin.putback(c);
            //读入操作符并将其存入栈中
            cin>>newoperand;
            Enter(newoperand);
            break;
        }
    }
    //答案已在栈顶,用peek输出之
    if(!s.StackEmpty())
        cout<<s.Peek()<<endl;
}
//清空操作数栈
void Calculator::Clear()
{
    s.ClearStack();
}

i like linux...
2008-04-18 11:34
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
//main.cpp

#include "Calculator.h"
int main()
{
    Calculator Calc;
    Calc.Run();
    system("pause");
    return 0;
}

i like linux...
2008-04-18 11:34
快速回复:谁能做表达式求值啊 求助!!!!!!!!!!!!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021203 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved