(复习)数据结构--栈--表达式求值

原创 2016年08月30日 20:33:36

很久都没有写栈的程序了呢……

表达式求值的精髓就在于先把中缀表达式转为后缀表达式,如把“2+3*4”转化为“2 3 4 * +”。一脸懵逼的同学可以自己回去看看学案或者百度百度。

由脑补可以后缀式求值是要用到栈的。

所有说表达式求值可以分为两部分:
——1.把中缀式转换为后缀式
——2.后缀式求值

代码:

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
char s[205];
char sta[205],top=0;
char ans[505],po=0;
int lev(char a)
{
    if(a=='-' || a=='+') return 1;
    if(a=='*' || a=='/') return 2;
    if(a=='^') return 3;
    if(a=='(' || a==')') return 4;
}
void space()
{
    if(ans[po]!=' ') ans[++po]=' ';
}
int power(int a,int k)
{
    int s=1;
    for(int i=1;i<=k;i++) s*=a;
    return s;
}
int main()
{
    freopen("expression.in","r",stdin);
    freopen("expression.out","w",stdout);
    scanf("%s",s+1);
    ans[0]=0;
    int len=strlen(s+1);
    for(int i=1;i<=len;i++)
    {
        if(s[i]>='0' && s[i]<='9') ans[++po]=s[i];
        else
        {
            if(s[i]=='/' || s[i]=='*' || s[i]=='-' || s[i]=='+' || s[i]=='^')
            {
                ans[++po]=' ';
                while(1)
                {
                    if(top==0 || sta[top]=='(' || lev(sta[top])<lev(s[i])) break;
                    space();
                    ans[++po]=sta[top];
                    space();
                    top--;
                }
                sta[++top]=s[i];
            }
            else if(s[i]=='(') {sta[++top]=s[i];}
            else if(s[i]==')')
            {
                while(1)
                {
                    if(top==0) break;
                    if(sta[top]=='(') {top--; break;}
                    space();
                    ans[++po]=sta[top];
                    space();
                    top--;
                }
            }
        }
    }
    while(1)
    {
        if(top==0) break;
        if(sta[top]!='(') {space(); ans[++po]=sta[top]; space();}
        top--;
    }
    //for(int i=1;i<=po;i++) cout<<ans[i];

    //中缀式转换为后缀式

    int num[205],top2=0;
    int pos=1;
    while(pos<=po)
    {
        if(ans[pos]==' ') pos++;
        if(ans[pos]>='0' && ans[pos]<='9')
        {
            char b[20];
            int l=0;
            while(ans[pos]>='0' && ans[pos]<='9')
            {
                b[++l]=ans[pos];
                pos++;
            }
            pos++;
            int t=1,s=0;
            for(int i=l;i>=1;i--)
            {
                s+=(b[i]-'0')*t;
                t*=10;
            }
            num[++top2]=s;
        }
        if(ans[pos]=='+')
        {
            num[top2-1]+=num[top2];
            top2--;
            pos++;
        }
        if(ans[pos]=='-')
        {
            num[top2-1]-=num[top2];
            top2--;
            pos++;
        }
        if(ans[pos]=='*')
        {
            num[top2-1]*=num[top2];
            top2--;
            pos++;
        }
        if(ans[pos]=='^')
        {
            num[top2-1]=power(num[top2-1],num[top2]);
            top2--;
            pos++;
        }
    }
    cout<<num[1];
    fclose(stdin);
    fclose(stdout);
    return 0;
}
版权声明:本文为博主原创文章,禁止所有形式的未经博主允许的转载行为。

数据结构课程设计---------用栈来实现表达式求值

1、需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式:表达式,例如2*(3+4)      包含的运算符只...
  • Hackbuteer1
  • Hackbuteer1
  • 2011年08月12日 21:40
  • 47297

常用数据结构栈的应用—-表达式求值

常用数据结构栈的应用—-表达式求值 常用数据结构栈的应用-表达式求值 栈 表达式求值 后缀表达式求值 中缀表达式转后缀表达式 代码示例栈 栈是常用的数据结构,栈又称堆栈,是一种受限的线性表。其限制...
  • u014532901
  • u014532901
  • 2016年09月13日 11:53
  • 1490

数据结构之---C语言实现栈的表达式求值(表达式树)

数据结构之---C语言实现栈的表达式求值(表达式树)
  • u012965373
  • u012965373
  • 2015年09月20日 22:44
  • 5065

c++表达式求值(利用数据结构栈)

主要是用到栈**先进后出**的数据结构。在该程序中建有两个栈:一个用于存储运算符OPTR(+-*/#),另一个OPND用于存储操作数或运算结果(5 2 2.5)。基本过程是: (1)首先设置操作数栈为...
  • cristina_song
  • cristina_song
  • 2017年10月23日 17:16
  • 141

表达式求值 数据结构 C/C++ 栈的应用

用书上的代码拼凑的,还是很有成就感的哈 支持的运算符号有"+","-","*","/","(",")","#"。 支持20位以内无符号整数,当然可以很容易的改成有符号或者是实型数 #includ...
  • yueashuxia
  • yueashuxia
  • 2009年10月28日 14:02
  • 1783

C++表达式求值(利用数据结构栈)

唉,刚刚用C++又重新写了一个较完善的表达式求值程序,最后精简后程序还不到100行,这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行而且功能还不是很齐全(当时还不能计算有括号的表...
  • u011390632
  • u011390632
  • 2014年05月04日 23:47
  • 4730

数据结构Java实现——①栈-->栈的应用三、算术表达式求值

当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2、思路 首先我们要知道表达式分为三类: ①中缀表达式:a+(b-c/d)*e ②前缀表达...
  • u011446177
  • u011446177
  • 2015年01月04日 12:44
  • 2942

数据结构例程——表达式求值(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值。例:用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,计算该表达式的运算结果。 解答:...
  • sxhelijian
  • sxhelijian
  • 2015年09月15日 11:00
  • 7007

数据结构(19)栈典型问题之C++实现表达式求值

导言 表达式求值 算法 算法具体实现导言表达式求值是程序设计语言中的一个最基本问题。本次实现采取“算符优先法”。表达式求值如何一个表达式都是由操作数、运算符和界限符组成的,我们称为单词。一般地,操作数...
  • YuYunTan
  • YuYunTan
  • 2016年03月23日 23:08
  • 1094

【新手 表达式求值】 顺序栈实现表达式求值

这几天一直在写表达式求值,
  • cutter_point
  • cutter_point
  • 2014年05月03日 11:30
  • 1867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(复习)数据结构--栈--表达式求值
举报原因:
原因补充:

(最多只允许输入30个字)