首页 > 编程语言 >数据结构——编程实现中缀表达式转成后缀表达式

数据结构——编程实现中缀表达式转成后缀表达式

时间:2024-12-05 17:02:27浏览次数:7  
标签:char return 中缀 postfix 运算符 数据结构 表达式

中缀表达式:运算符在操作数中间 例如3+4,3*4

后缀表达式:运算符在操作数的后面 例如3 4+,3 4*

计算机在运算时,要把中缀表达式转成前缀表达式(波兰式)或后缀表达式(逆波兰式),因为计算机遍历中缀表达式时的时间复杂度太大

举例:3+4*2-2/(1+1)+5=3+8-1+5=15

转成后缀表达式为:3 4 2 *+2 1 1 +/ -5+

计算机运算过程:计算机逐个遍历,直到遍历到运算符,遍历到运算符后将该运算符的前两个操作数(双目运算符)进行运算

3 4 2 *+2 1 1 +/ -5+下一步为3 8 + 2 2 / - 5 +

笔试/填空题求解方法:

加括号,放后面

中缀表达式 :3+4*2-2/(1+1)+5

在不改变优先级的前提下加括号

(((3+(4*2))-( 2 /  ( 1 + 1 ) ))+ 5 )

把运算符放在对应括号的后面

(((3(4 2)*)+( 2  ( 1  1 ) +)/ )- 5 )+

得到后缀表达式:

           3   4  2   *    +    2     1  1   +   /     - 5     +

同理后缀表达式转成中缀表达式:加括号,放前面

算法实现:

#include <stdio.h>  
#include <stdlib.h>  
#include <ctype.h>  
#include <string.h>  

#define MAX 100  

typedef struct {  
    char data[MAX];  
    int top;  
} Stack;  

// 栈操作函数  
void initStack(Stack* s) {  
    s->top = -1;  
}  

int isFull(Stack* s) {  
    return s->top == MAX - 1;  
}  

int isEmpty(Stack* s) {  
    return s->top == -1;  
}  

void push(Stack* s, char element) {  
    if (!isFull(s)) {  
        s->data[++s->top] = element;  
    } else {  
        printf("栈满,无法压入元素 %c\n", element);  
    }  
}  

char pop(Stack* s) {  
    if (!isEmpty(s)) {  
        return s->data[s->top--];  
    }  
    return '\0'; // 返回空字符表示栈为空  
}  

char peek(Stack* s) {  
    if (!isEmpty(s)) {  
        return s->data[s->top];  
    }  
    return '\0';  
}  

// 判断运算符优先级  
int precedence(char op) {  
    switch (op) {  
        case '+':  
        case '-':  
            return 1;  
        case '*':  
        case '/':  
            return 2;  
        case '^':  
            return 3;  
        default:  
            return 0;  
    }  
}  

// 中缀表达式转后缀表达式的函数  
void infixToPostfix(char* infix, char* postfix) {  
    Stack s;  
    initStack(&s);  
    int j = 0;  

    for (int i = 0; infix[i] != '\0'; i++) {  
        char current = infix[i];  

        if (isalnum(current)) { // 如果是数字或字母,直接添加到后缀表达式  
            postfix[j++] = current;  
        } else if (current == '(') {  
            push(&s, current);  
        } else if (current == ')') {  
            while (!isEmpty(&s) && peek(&s) != '(') {  
                postfix[j++] = pop(&s);  
            }  
            pop(&s); // 弹出 '('  
        } else { // 运算符  
            while (!isEmpty(&s) && precedence(peek(&s)) >= precedence(current)) {  
                postfix[j++] = pop(&s);  
            }  
            push(&s, current);  
        }  
    }  

    // 弹出栈中剩余的运算符  
    while (!isEmpty(&s)) {  
        postfix[j++] = pop(&s);  
    }  

    postfix[j] = '\0'; // 添加字符串结束符  
}  

int main() {  
    char infix[MAX];  
    char postfix[MAX];  

    printf("请输入中缀表达式: ");  
    scanf("%s", infix);  

    infixToPostfix(infix, postfix);  
    printf("后缀表达式为: %s\n", postfix);  

    return 0;  
}

标签:char,return,中缀,postfix,运算符,数据结构,表达式
From: https://blog.csdn.net/m0_74317206/article/details/144120283

相关文章

  • 数据结构实验一
    数据结构实验一2024.12.5采用递增有序的顺序表表示集合,求解两个集合的交集、并集和差集(1)定义顺序表的存储结构;(2)实现存储递增有序集合的顺序表的建立、求交集、并集和差集等运算;(3)要求算法的时间性能在线性时间复杂度内;(4)和采用无序顺序表所表示的集合的有关运算的时间性能......
  • mysql索引概念以及索引底层数据结构
    一、什么是MySQL索引索引是数据库管理系统中一种用于提高数据检索效率的数据结构。通过在表的一个或多个列上创建索引,可以显著加快数据查询的速度,但会增加插入、删除和更新操作的开销。MySQL中索引的核心作用是快速定位数据位置,减少磁盘I/O操作,从而提高查询效率。索......
  • 数据结构:顺序表详解
    1.顺序表的概念与定义2.顺序表的初始化与销毁3.顺序表的头/尾部的插入与删除4.顺序表指定位置的插入和删除4.对顺序表中的数据的查找5.总结我以过客之名,祝你前程似锦一.顺序表的概念与定义1.概念:顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是......
  • 数据结构(栈Stack)
    1.前言:在计算机科学中,栈(Stack)是一种基础而存在的数据结构,它的核心特性是后进先出(LIFO,LastIn,FirstOut)。想象一下,在现实生活中我们如何处理一堆托盘——我们总是将新托盘放在最上面,而取托盘时则从最上面开始,这正好与托盘的操作方式相吻合。栈的简单结构和高效的操作,使得在......
  • 正则表达式总结-2
    转载:10个Python正则表达式文本搜索和替换技巧正则表达式(Regex)是处理文本的强大工具,尤其在Python中,通过re模块,我们可以灵活地进行搜索、匹配、替换等操作。下面,我们将深入浅出地介绍20个实用的Python正则表达式技巧,适合初学者逐步掌握,直到能够自信地运用到实际项目中。基本匹配......
  • 数据结构学习笔记
    ……接上文4.2顺序栈4.2.2代码实现头文件seqstack.h:#ifndef__SEQSTACK_H__#define__SEQSTACK_H__typedefintdatatype;typedefstructseqstack{datatype*data;//指向栈的存储位置intmaxlen;//保存栈的最大长度inttop;/......
  • 数据结构(2)——顺序表的模拟实现
    一:顺序表的认识通过数据结构(1)对于算法复杂度的理解,现在我们正式进入数据结构的核心内容,今天,先来使用C语言实现一下数据结构中最简单的顺序表。首先介绍一下顺序表的概念,先从线性表说起。线性表:n个具有相同结构的数据元素的有限序列。在逻辑结构上一定是线性的,在物理结构上不......
  • Java入门--运算符和表达式
    Java入门1、算术运算符实现对两个数的运算,程序输出效果为:请输入第一个整数:25请输入第二个整数:8两数相加的结果为:33两数相减的结果为:17两数相乘的结果为:200两数相除的结果为:3两数取余数的结果为:1以下是Java代码:publicclassCalculate{publicstaticvoidmain(......
  • nginx中的正则表达式,location路径匹配规则和优先级 转载
    博客园熊仔其人原创,侵权删,前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。先准备好环境,基础配置是这样nginx/conf/conf.d/host.conf:server{listen8081;server_name10.90.5.70;proxy_connect_timeout60;pr......
  • 数据结构:树
    树的基本定义:树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除......