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

原创 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;
}
版权声明:本文为博主原创文章,禁止所有形式的未经博主允许的转载行为。

相关文章推荐

数据结构 栈 表达式求值

  • 2011年11月22日 19:23
  • 159KB
  • 下载

数据结构 栈的应用——算术表达式求值

实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数...

【数据结构】栈的应用——中缀表达式求值(c++)

头文件: #pragma once #include #include #include using namespace std; template class SeqStack ...

数据结构第二次作业(表达式求值【栈模拟】)

实验题目:栈的应用-算术表达式求值                                          实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 ...

数据结构:栈的典型应用之二:四则运算表达式求值(C++)

#include #include #include using namespace std; /***********************************************...

数据结构实验2---表达式求值(“栈”实现)

#include #include #include #include #define STACK_INIT_SIZE 100 #define INCREAMENT 1...

回顾数据结构之栈的应用-表达式求值

求测试 #include #include #include #include #include using namespace std; stack op; sta...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(复习)数据结构--栈--表达式求值
举报原因:
原因补充:

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