| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2120 人关注过本帖, 2 人收藏
标题:栈的表达式求值
只看楼主 加入收藏
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
结帖率:84%
收藏(2)
已结贴  问题点数:20 回复次数:15 
栈的表达式求值
各位大侠,问个问题。栈的表达式求值的代码怎么写啊!
还有看了很多的例子怎么都不能实现,比如说我输入  98*6+8-7+(9-2)*2  怎么计算
还有中缀式和后缀式怎么转换,求解。
搜索更多相关主题的帖子: 求值 表达 
2010-10-26 10:57
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
二叉树????

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-10-26 11:03
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:0 
呵呵我以前写过!要不??
图片附件: 游客没有浏览图片的权限,请 登录注册

If You Want Something, Go Get It, Period.
2010-10-26 13:19
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
收藏
得分:0 
数据结构。。。
2010-10-26 13:49
az9841682
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:312
专家分:596
注 册:2009-9-11
收藏
得分:0 
百度过来的
程序代码:
编译原理上机实验—
中缀式构造后缀式
一.基础知识
中缀表达式到后缀表达式的转换
要把表达式从中缀表达式的形式转换成用后缀表示法表示的等价表达式,必须了解操作符的优先级和结合性。优先级或者说操作符的强度决定求值顺序;优先级高的操作符比优先级低的操作符先求值。如果所有操作符优先级一样,那么求值顺序就取决于它们的结合性。操作符的结合性定义了相同优先级操作符组合的顺序(从右至左或从左至右)。
转换过程包括用下面的算法读入中缀表达式的操作数、操作符和括号:
设立一个栈,存放运算符,首先栈为空,编译程序从左到右扫描中缀表达式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;若遇到运算符,则必须与栈顶比较,运算符级别比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。当栈变成空时,输出的结果即为后缀表达式。
二.基本要求
1.完成标准中缀算术表达式到后缀表达式的自动转换。
  2.中缀表达式由键盘输入,以回车键结束。
  3.输入的中缀表达式符合以下要求:

 (1)中缀表达式在逻辑上和结构上无错。

 (2)中缀表达式长度不确定但不超过128个。

 (3)中缀表达式仅出现在一行输入行中。

 (4)中缀表达式中只包含4种2目运算符:+,-,*,/   及两种优先级运算符“(”和“)”。

 (5)中缀表达式中的运算数由{a,b,…,z}中的单个字母或{0,1,…,8,9}中的单个数字。即一个运算数值包含一个字母或一位数字。

 (6)中缀表达式中不包含多余的空格。
  4.程序输出一行相应的后缀表达式。
二.源程序
/*设立一个栈,存放运算符,首先栈为空,编译程序从左到右扫描中缀表达式,
若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;
若遇到运算符,则必须与栈顶比较,运算符级别比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;
若遇到左括号,进栈;
若遇到右括号,则一直退栈输出,直到退到左括号止。当栈变成空时,输出的结果即为后缀表达式。*/
#include<iostream.h>
#include<stdio.h>
void main()
{
       char str[128];
       char stack[128];
       stack[0]=''1'';
       char *p;
       p=str;
       char *q;
       q=stack;
       cout<<"请输入待处理的中缀表达式!"<<endl;
       cout<<"输入的中缀表达式符合以下要求: "<<endl;
       cout<<"(1)中缀表达式在逻辑上和结构上无错。"<<endl;
       cout<<"(2)中缀表达式长度不确定但不超过128个。"<<endl;
       cout<<"(3)中缀表达式仅出现在一行输入行中。"<<endl;
       cout<<"(4)中缀表达式中只包含4种2目运算符:+,-,*,/及两种优先级运算符(和)。"<<endl;
       cout<<"(5)中缀表达式中的运算数由{a,b,…,z}{0,1,…,9}中的单个字母组成"<<endl;
       cout<<"(6)中缀表达式中不包含多余的空格。"<<endl;
       p=gets(str);//从键盘输入该表达式
       while(*p!=''\0'')
       {
              if((*p>=''a''&&*p<=''z'')||(*p>=''0''&&*p<=''9''))
              {
                     cout<<*p<<" ";
              }
              else
                     if(*p==''(''||*p=='')'')//左括号或者右括号
                     {
                            if(*p==''('')//左括号,进栈
                            {
                                   q++;
                                   *q=*p;
                            }
                            else//右括号,出栈到左括号
                            {
                                   while(*q!=''('')
                                   {
                                          cout<<*q<<" ";
                                          q--;
                                   }
                                          q--;
                            }

                     }
                     else
                     {
                            if(((*p==''*''||*p==''/'')&&(*q==''+''||*q==''-''))||*q==''1''||*q==''('')//优先级比栈顶高
                            {
                                   q++;
                                   *q=*p;
                            }
                            else
                            {
                                   cout<<*q<<" ";
                                   q--;
                                   p--;
                            }
                     }
              p++;
       }
       while(*q!=''1'')//栈中元素全部出栈
       {
              cout<<*q<<" ";
              q--;
       }
}


文章出处:飞诺网(www.):http://dev.
2010-10-26 14:00
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
回复 3楼 m21wo
那先谢谢你了,发过来给我看看吧!可能你的c++有些函数我看不懂。O(∩_∩)O哈哈~ 谢谢
2010-10-26 17:34
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:5 
你怎么知道用C++写的!

If You Want Something, Go Get It, Period.
2010-10-26 18:09
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:10 
程序代码:
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <stdlib.h>
using namespace std;
template <class T>
class Node
{
private:
    Node<T>* link;
public:
    T element;
    Node(T d=0,Node<T>* lk=0):element(d),link(lk)
    {}
     template<class Tpye> friend class Stack;
};
template <class T>
class Stack
{
private:
    Node<T>* top;
public:
    int size;
    Stack()
    {
        top=NULL;
        size=0;
    }
    ~Stack()
    {
        ClearStack();
        top=NULL;
    }
    bool IsEmpty() const
    {
        return size==0;
    }
    int Stacksize() const
    {
        return size;
    }
    bool Top(T& x) const
    {
        if(IsEmpty())
        {
            cout<<"Empty!!"<<endl;
            return false;
        }
        x=top->element;
        return true;
    }
    void Push(T x)
    {
        Node<T>* p;
        p=new Node<T>(x,top);
        top=p;
        size++;
    }
    T Pop()
    {
        if(size==0)
        {
            cout<<"没有元素为空!!"<<endl;
            exit(0);
        }
        Node<T> *p=top->link;
        T x=top->element;
        delete top;
        top=p;
        size--;
        return x;
    }
    void ClearStack()
    {
        Node<T> *p,*q;
        p=top;
        while(p!=NULL)
        {
            q=p;
            p=p->link;
            delete q;
        }
        size=0;
    }
};
int icp(char s)
{
    switch(s)
    {
    case '#': return 0;break;
    case '(': return 7;break;
    case '*' :case'/':return 4;break;
    case '+':case'-':return 2;break;
    case ')':return 1;break;
    case '^':return 6;break;
    default:
        cout<<"input error!"<<endl;break;
    }
}
int isp(char c)
{
    switch(c)
    {
    case '#': return 0;break;
    case '(': return 1;break;
    case '*' :case'/':return 5;break;
    case '+':case'-':return 3;break;
    case ')':return 7;break;
    case '^':return 4;break;
    default:
        cout<<"input error!"<<endl;break;
    }
}
double calculator()
{
    Stack<char> s1;
    Stack<double> s2;
    s1.Push('#');
    char ch;
    double x;
    cout<<"请输入中缀表达式,以符号#结束"<<"\n\n";
    while(cin>>ch)
    {

        if(isdigit(ch))
        {
            cin.putback(ch);
            cin>>x;
            s2.Push(x);
        }
        else
        {
            char z,w;
            for(int i=0;i<=s1.size+1;i++)
            {
                s1.Top(z);
                if(icp(ch)<isp(z))
                {
                    w=s1.Pop();
                    double x1,x2;
                    x2=s2.Pop();
                    x1=s2.Pop();
                    switch(w)
                    {
                    case '+': x1+=x2;break;
                    case '-': x1-=x2;break;
                    case '*': x1*=x2;break;
                    case '/': x1/=x2;break;
                    case '^': x1=pow(x1,x2);break;
                    }
                    s2.Push(x1);
                }
                else if(icp(ch)==isp(z))
                {
                    s1.Pop();break;
                }
                else
                {
                    s1.Push(ch);break;
                }
            }
            if(s1.size==0)
                break;
        }

    }
    double s;
    s2.Top(s);
    return s;
}
int main()
{
    double m;
    m=calculator();
    cout<<"计算结果为:"<<"\n\n";
    cout.precision(10);
    cout<<m<<"\n\n";;
}







If You Want Something, Go Get It, Period.
2010-10-26 18:37
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
回复 8楼 m21wo
我编译你的程序怎么出现错误呢!还有我的水平真的一般,看不懂你的程序。
希望你能写的简单一些。
2010-10-27 08:20
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:1 
没错误啊 !要建C++ 文件

If You Want Something, Go Get It, Period.
2010-10-27 12:29
快速回复:栈的表达式求值
数据加载中...
 
   



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

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