关闭

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

标签: 数据结构
228人阅读 评论(0) 收藏 举报
分类:

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

表达式求值的精髓就在于先把中缀表达式转为后缀表达式,如把“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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27606次
    • 积分:1157
    • 等级:
    • 排名:千里之外
    • 原创:81篇
    • 转载:1篇
    • 译文:1篇
    • 评论:2条
    最新评论