数据结构中缀表达式转换为后缀表达式并求值,pta试题,小白心酸史

数据结构中缀表达式转换为后缀表达式并求值

1 中缀表达式转换为后缀表达式并求值 (100分)

把题目给出中缀表达式转换为后缀表达式输出,并求后缀表达式的值。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。

输入格式:
输入的第一行是一个正整数 N ,表示以下有 N 行。每行是一个中缀表达式。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。

输出格式:
输出每行中缀表达式所对应后缀表达式,隔一个空格之后,输出该后缀表达式计算之后得到的值。

输入样例:
在这里给出一组输入。例如:

6
2+4
3+27
2
(4+6)
(5/2+4)5+2
(3+5)
(7-2)/4
5*(8-(3+2))

输出样例:
在这里给出相应的输出。例如:

24+ 6
327*+ 17
246+* 20
52/4+5*2+ 32
35+72-4/ 10
5832±
15

// An highlighted block
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct _nodechar
{
    char data;
    struct _nodechar *next;
} nodechar;

typedef struct _stackchar
{
    int size;
    nodechar *top;
} stackchar;

//创建
stackchar *createStackchar(void);
//入栈
void pushchar(stackchar* pStack, char x);
//出栈 #include <ctype.h>
void popchar(stackchar* pStack);
//获取栈顶元素
char topchar(stackchar* pStack);
//判空
bool emptychar(stackchar* pStack);
//销毁
void destroyStackchar(stackchar* pStack);

int getPriority(char op);

typedef struct _nodeint
{
    int data;
    struct _nodeint *next;
} nodeint;

typedef struct _stackint
{
    int size;
    nodeint *top;
} stackint;

//创建
stackint *createStackint(void);
//入栈
void pushint(stackint* pStack, int x);
//出栈
void popint(stackint* pStack);
//获取栈顶元素
int topint(stackint* pStack);
//判空
bool emptyint(stackint* pStack);
//销毁
void destroyStackint(stackint* pStack);

int calucalte(int op1, char op, int op2);

int main(void)
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        char infix[21], postfix[21] = "\0";
        int index = 0;
        scanf("%s", infix);
        stackchar *pStackchar = createStackchar();
        for(int i = 0; infix[i] != '\0'; i++)
        {
            if(infix[i] >= '0' && infix[i] <= '9')
            {
                postfix[index++] = infix[i];
            }
            else if(infix[i] == '(')
            {
                pushchar(pStackchar, infix[i]);
            }
            else if(infix[i] == ')')
            {
                char c = topchar(pStackchar);
                popchar(pStackchar);
                while(c != '(')
                {
                    postfix[index++] = c;
                    c = topchar(pStackchar);
                    popchar(pStackchar);
                }
            }
            else
            {
                if(emptychar(pStackchar) || getPriority(infix[i]) >getPriority(topchar(pStackchar)))
                {
                    pushchar(pStackchar, infix[i]);
                }
                else
                {
                    while(!emptychar(pStackchar) && getPriority(infix[i]) <= getPriority(topchar(pStackchar)))
                    {
                        char c = topchar(pStackchar);
                        popchar(pStackchar);
                        postfix[index++] = c;
                    }
                    pushchar(pStackchar, infix[i]);
                }
            }
        }
        while(!emptychar(pStackchar))
        {
            char c = topchar(pStackchar);
            popchar(pStackchar);
            postfix[index++] = c;
        }
        printf("%s", postfix);
        destroyStackchar(pStackchar);
        stackint *pStackint = createStackint();
        for(int i = 0; postfix[i] != '\0'; i++)
        {
            if(postfix[i] >= '0' && postfix[i] <= '9')
            {
                int m = postfix[i] - '0';
                pushint(pStackint, m);
            }
            else
            {
                char op = postfix[i];
                int op2, op1;
                op2 = topint(pStackint);
                popint(pStackint);
                op1 = topint(pStackint);
                popint(pStackint);
                pushint(pStackint, calucalte(op1, op, op2));
            }
        }
        int answer = topint(pStackint);
        printf(" %d\n", answer);
        popint(pStackint);
        destroyStackint(pStackint);
    }
    return 0;
}

int getPriority(char op)
{
    if(op == '+' || op =='-')
        return 1;
    if(op == '*' || op == '/')
        return 2;
    return 0;
}

int calucalte(int op1, char op, int op2)
{
    switch(op)
    {
    case '+':
        return op1 + op2;
        break;
    case '-':
        return op1 - op2;
        break;
    case '*':
        return op1 * op2;
        break;
    case '/':
        return op1 / op2;
        break;
    }
    return 0;
}
//创建
stackchar *createStackchar(void)
{
    stackchar* p = (stackchar*)malloc(sizeof(stackchar));
    p->size = 0;
    p->top = NULL;
    return p;
}
//入栈
void pushchar(stackchar* pStack, char x)
{
    nodechar *t = (nodechar*)malloc(sizeof(nodechar));
    t->data = x;
    t->next = pStack->top;
    pStack->top = t;
    pStack->size++;
}
//出栈
void popchar(stackchar* pStack)
{
    nodechar *t = pStack->top;
    pStack->top = t->next;
    free(t);
    pStack->size--;
}
//获取栈顶元素
char topchar(stackchar* pStack)
{
    return pStack->top->data;
}
//判空
bool emptychar(stackchar* pStack)
{
    //return pStack->size == 0;
    return pStack->top == NULL;
}
//销毁
void destroyStackchar(stackchar* pStack)
{
    while (!emptychar(pStack))
    {
        popchar(pStack);
    }
    free(pStack);
}

stackint *createStackint(void)
{
    stackint* p = (stackint*)malloc(sizeof(stackint));
    p->size = 0;
    p->top = NULL;
    return p;
}
//入栈
void pushint(stackint* pStack, int x)
{
    nodeint *t = (nodeint*)malloc(sizeof(nodeint));
    t->data = x;
    t->next = pStack->top;
    pStack->top = t;
    pStack->size++;
}
//出栈
void popint(stackint* pStack)
{
    nodeint *t = pStack->top;
    pStack->top = t->next;
    free(t);
    pStack->size--;
}
//获取栈顶元素
int topint(stackint* pStack)
{
    return pStack->top->data;
}
//判空
bool emptyint(stackint* pStack)
{
    //return pStack->size == 0;
    return pStack->top == NULL;
}
//销毁
void destroyStackint(stackint* pStack)
{
    while (!emptyint(pStack))
    {
        popint(pStack);
    }
    free(pStack);
}

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先需要将中缀表达式转换后缀表达式。可以使用一个操作符栈来辅助转换过程。从左到右扫描中缀表达式的每个字符,并根据优先级进行相应的操作。 具体步骤如下: 1. 定义一个操作符栈和一个后缀表达式字符串。 2. 从左到右扫描中缀表达式的每个字符: - 如果遇到数字,直接添加到后缀表达式字符串中。 - 如果遇到左括号,将其压入操作符栈。 - 如果遇到右括号,弹出操作符栈中的操作符,并将其添加到后缀表达式字符串中,直到遇到左括号为止,并将左括号从操作符栈中弹出。 - 如果遇到操作符,比较其与操作符栈栈顶操作符的优先级: - 如果该操作符优先级大于栈顶操作符优先级,将其压入操作符栈。 - 如果该操作符优先级小于等于栈顶操作符优先级,将栈顶操作符弹出,并将其添加到后缀表达式字符串中,直到栈顶操作符优先级小于该操作符,或者栈为空,然后将该操作符压入操作符栈。 3. 扫描完中缀表达式后,将操作符栈中的所有操作符依次弹出,并添加到后缀表达式字符串中。 4. 最后,后缀表达式字符串即为转换后的后缀表达式。 接下来是对后缀表达式进行求值的过程: 1. 定义一个数栈。 2. 从左到右扫描后缀表达式的每个字符: - 如果遇到数字,将其转换成数并压入数栈。 - 如果遇到操作符,从数栈中弹出两个数,进行相应的操作,并将结果压入数栈。 3. 扫描完后缀表达式后,数栈中的唯一元素即为求值结果。 综上所述,将中缀表达式转换后缀表达式并求的过程如上所述。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值