栈求解中缀表达式

表达式求值是进行数据处理的最基本操作。请编写程序完成一个简单算术表达式的求值。要求如下: 

(1) 运算符包括:+、-、*、-、^(乘方)、括号

(2)运算量为数值常量,根据自己的能力可以对运算量做不同的约束,例如1位整数、多位整数、实数等(会有不同的测试用例);

 

输入:一行,即表达式,以“=”结束。例如:

           5*(8-3)+6/5=

输出:一行,即表达式的值。结果值为整数时输出为整数,如果有小数时保留5位小数。

           26.20000

#define Stack_init_size 100
#define Stack_add 10
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
using namespace std;

typedef struct
{
    char *base;
    char *top;
    int stacksize;
} SqStack1;
typedef struct
{
    double *base;
    double *top;
    int stacksize;
} SqStack2;
void InitStack(SqStack1 &S)
{
    S.base=(char *)malloc(Stack_init_size*sizeof(char));
    if(!S.base)
        exit(1);
    S.top=S.base;
    S.stacksize=Stack_init_size;
    return;
}
void InitStack(SqStack2 &S)
{
    S.base=(double *)malloc(Stack_init_size*sizeof(double));
    if(!S.base)
        exit(1);
    S.top=S.base;
    S.stacksize=Stack_init_size;
    return;
}
void Push(SqStack1 &S,char e)
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(char *)realloc(S.base,(S.stacksize+Stack_add)*sizeof(char));
        if(!S.base)
            exit(1);
        S.stacksize+=Stack_add;
    }
    *S.top++=e;
    return;
}
void Push(SqStack2 &S,double e)
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(double *)realloc(S.base,(S.stacksize+Stack_add)*sizeof(double));
        if(!S.base)
            exit(1);
        S.top=S.base+S.stacksize;
        S.stacksize+=Stack_add;
    }
    *S.top++=e;
    return;
}
bool Pop(SqStack1 &S,char &e)
{
    if(S.base==S.top)
        return false;
    e=*(--S.top);
    return true;
}
bool Pop(SqStack2 &S,double &e)
{
    if(S.base==S.top)
        return false;
    e=*(--S.top);
    return true;
}
char GetTop(SqStack1 &S)
{
    if(S.base==S.top)
        return 0;
    return *(S.top-1);
}
double GetTop(SqStack2 &S)
{
    if(S.base==S.top)
        return 0;
    return *(S.top-1);
}
bool In(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='^')
        return true;
    return false;
}
double todouble(char s[])
{
    double val, power;
    int i=0, sign;
    sign = (s[i] == '-')? -1 : 1;
    if(s[i] == '+' || s[i] == '-')
        i++;
    for(val = 0.0; isdigit(s[i]); i++)
    {
        val = val * 10 + (s[i] - '0');
    }
    if(s[i] == '.')
        i++;
    for(power = 1.0; isdigit(s[i]); i++)
    {
        val = 10.0 * val + (s[i] - '0');
        power *= 10;
    }
    return sign * val / power;
}
double power(double a,double b)
{
    double s=1.0;
    for(int i=0; i<b; i++)
        s=s*a;
    return s;
}
double Operate(double a,char theta,double b)
{
    switch(theta)
    {
    case'+':
        return a+b;
    case'-':
        return a-b;
    case'*':
        return a*b;
    case'/':
        return a/b;
    case'^':
        return power(a,b);
    default:
        return 0;
    }
}
char Precede(char m,char n)
{
    char Prior[8][8] =   // 算符间的优先关系
    {
        '>','>','<','<','<','>','>','<',
        '>','>','<','<','<','>','>','<',
        '>','>','>','>','<','>','>','<',
        '>','>','>','>','<','>','>','<',
        '<','<','<','<','<','=',' ','<',
        '>','>','>','>',' ','>','>','>',
        '<','<','<','<','<',' ','=','<',
        '>','>','>','>','<','>','>','>'
    };
    char ch[8]= {'+','-','*','/','(',')','=','^'};
    int i,j;
    for(i=0; i<8; i++)
        if(m==ch[i])
            break;
    for(j=0; j<8; j++)
        if(n==ch[j])
            break;
    return Prior[i][j];
}
void perfect(char s[])
{
    char s1[100];
    int i,j,n;
    i=j=0;
    if(s[0]=='-')
        s1[j++]='0';
    s1[j++]=s[i++];
    while(s[i])
    {
        if(s[i]=='-'&&In(s[i-1])&&s[i-1]!=')')
        {
            s1[j++]='0';
            s1[j++]=s[i++];
        }
        s1[j++]=s[i++];
    }
    s1[j]='\0';
    i=0;
    while(s1[i])
    {
        s[i]=s1[i];
        i++;
    }
    s[i]='\0';
}
double EvaluateExpression()
{
    char x,theta,z[100][20];
    double a,b;
    int i,j=0,k=0;
    char s[100];
    cin>>s;
    perfect(s);
    SqStack1 OPTR;//寄存运算符
    SqStack2 OPND;//寄存操作数和操作结果
    InitStack(OPTR);
    InitStack(OPND);
    Push(OPTR,'=');
    while(s[j]!='='||GetTop(OPTR)!='=')
    {
        if(!In(s[j]))
        {
            i=0;
            while(isdigit(s[j])||s[j]=='.')
            {
                z[k][i++]=s[j++];
            }
            Push(OPND,todouble(z[k]));
            k++;
        }
        else
            switch(Precede(GetTop(OPTR),s[j]))
            {
            case'<':
                Push(OPTR,s[j]);
                j++;
                break;
            case'=':
                Pop(OPTR,x);
                j++;
                break;
            case'>':
                Pop(OPTR,theta);
                Pop(OPND,b);
                Pop(OPND,a);
                Push(OPND,Operate(a,theta,b));
                break;
            }
    }
    return GetTop(OPND);
}
int main()
{
    double ans=EvaluateExpression();
    if (abs(ans-(int)ans)<=0.000001) printf("%d\n",(int)ans);
    else
        printf("%.5f\n",ans);
    return 0;
}

 

好的,以下是一个C语言程序,可以求解中缀表达式: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int top; } Stack; void Stack_Init(Stack *s) { s->top = -1; } int Stack_IsEmpty(Stack *s) { return s->top == -1; } int Stack_IsFull(Stack *s) { return s->top == MAXSIZE - 1; } void Stack_Push(Stack *s, int x) { if (Stack_IsFull(s)) { printf("已满,无法入!\n"); exit(1); } s->data[++s->top] = x; } int Stack_Pop(Stack *s) { if (Stack_IsEmpty(s)) { printf("已空,无法出!\n"); exit(1); } return s->data[s->top--]; } int Stack_Top(Stack *s) { if (Stack_IsEmpty(s)) { printf("已空,无法取顶元素!\n"); exit(1); } return s->data[s->top]; } int op_priority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; case '(': return 0; default: printf("不支持的操作符:%c\n", op); exit(1); } } int calculate(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: printf("不支持的操作符:%c\n", op); exit(1); } } int infix_expression(char *str) { Stack op_stack, num_stack; int i, len, num, a, b; char op; Stack_Init(&op_stack); Stack_Init(&num_stack); len = strlen(str); i = 0; while (i < len) { if (str[i] >= '0' && str[i] <= '9') { num = 0; while (i < len && str[i] >= '0' && str[i] <= '9') { num = num * 10 + str[i] - '0'; i++; } Stack_Push(&num_stack, num); } else if (str[i] == '(') { Stack_Push(&op_stack, str[i]); i++; } else if (str[i] == ')') { while (Stack_Top(&op_stack) != '(') { b = Stack_Pop(&num_stack); a = Stack_Pop(&num_stack); op = Stack_Pop(&op_stack); Stack_Push(&num_stack, calculate(a, b, op)); } Stack_Pop(&op_stack); i++; } else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') { while (!Stack_IsEmpty(&op_stack) && op_priority(str[i]) <= op_priority(Stack_Top(&op_stack))) { b = Stack_Pop(&num_stack); a = Stack_Pop(&num_stack); op = Stack_Pop(&op_stack); Stack_Push(&num_stack, calculate(a, b, op)); } Stack_Push(&op_stack, str[i]); i++; } else { printf("不支持的字符:%c\n", str[i]); exit(1); } } while (!Stack_IsEmpty(&op_stack)) { b = Stack_Pop(&num_stack); a = Stack_Pop(&num_stack); op = Stack_Pop(&op_stack); Stack_Push(&num_stack, calculate(a, b, op)); } return Stack_Pop(&num_stack); } int main() { char str[MAXSIZE]; int result; printf("输入一个中缀表达式:"); scanf("%s", str); result = infix_expression(str); printf("结果为:%d\n", result); return 0; } ``` 这个程序首先定义了一个的结构体,包含了的数据和顶指针。然后定义了一些的操作函数,包括初始化、判断是否为空、判断是否满、入、出和取顶元素等。接着定义了两个辅助函数,一个用于获取操作符的优先级,另一个用于算两个数的运算结果。最后定义了一个函数用于求解中缀表达式,这个函数使用了两个一个用于存储操作符,一个用于存储数字。在遍历中缀表达式的过程中,如果遇到数字,就直接将其入数字;如果遇到左括号,就将其入操作符;如果遇到右括号,就将操作符中的操作符依次出,同时从数字中弹出两个数字进行算,并将算结果再次入数字;如果遇到其他操作符,就将操作符中优先级高于等于当前操作符的操作符依次出,同时从数字中弹出两个数字进行算,并将算结果再次入数字。最后,当操作符为空时,数字中存储的就是中缀表达式算结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值