中缀转前缀

本文介绍了如何使用C语言中的栈数据结构,通过infixToPrefix函数将中缀表达式转换为前缀表达式,包括栈的基本操作和优先级处理。
摘要由CSDN通过智能技术生成

这个程序首先定义了一个栈结构,并实现了栈的基本操作。然后使用了一个函数infixToPrefix来将中缀表达式转换为前缀表达式。最后在main函数中接收用户输入的中缀表达式,并输出转换后的前缀表达式。

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

#define MAX_SIZE 100

typedef struct {
    char items[MAX_SIZE];
    int top;
} Stack;

void initialize(Stack *s) {
    s->top = -1;
}

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

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

void push(Stack *s, char c) {
    if (isFull(s)) {
        printf("Stack overflow\n");
        exit(1);
    }
    s->items[++(s->top)] = c;
}

char pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack underflow\n");
        exit(1);
    }
    return s->items[(s->top)--];
}

int isOperator(char c) {
    return (c == '+' || c == '-' || c == '*' || c == '/');
}

int precedence(char c) {
    if (c == '*' || c == '/') {
        return 2;
    } else if (c == '+' || c == '-') {
        return 1;
    } else {
        return 0;
    }
}

void infixToPrefix(char *infix, char *prefix) {
    Stack operatorStack;
    initialize(&operatorStack);
    int i, j;
    int len = strlen(infix);

    for (i = len - 1, j = 0; i >= 0; i--) {
        char token = infix[i];
        if (token == ')') {
            push(&operatorStack, token);
        } else if (token == '(') {
            while (!isEmpty(&operatorStack) && operatorStack.items[operatorStack.top] != ')') {
                prefix[j++] = pop(&operatorStack);
            }
            if (!isEmpty(&operatorStack)) {
                pop(&operatorStack); // pop the '('
            }
        } else if (isOperator(token)) {
            while (!isEmpty(&operatorStack) && precedence(operatorStack.items[operatorStack.top]) > precedence(token)) {
                prefix[j++] = pop(&operatorStack);
            }
            push(&operatorStack, token);
        } else {
            prefix[j++] = token;
        }
    }

    while (!isEmpty(&operatorStack)) {
        prefix[j++] = pop(&operatorStack);
    }

    prefix[j] = '\0';

    // Reverse the prefix expression
    int start = 0;
    int end = strlen(prefix) - 1;
    while (start < end) {
        char temp = prefix[start];
        prefix[start] = prefix[end];
        prefix[end] = temp;
        start++;
        end--;
    }
}

int main() {
    char infix[MAX_SIZE];
    char prefix[MAX_SIZE];

    printf("Enter an infix expression: ");
    fgets(infix, MAX_SIZE, stdin);
    infix[strcspn(infix, "\n")] = '\0'; // remove the newline character from input

    infixToPrefix(infix, prefix);
    printf("The corresponding prefix expression is: %s\n", prefix);

    return 0;
}
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:– JavaScript 中的患者数据管理系统 患者数据管理系统是为医院开发的 node JS 项目。通过使用此系统,您可以轻松访问患者数据,它具有成本效益,可改善患者护理和数据安全性。不仅如此,它还减少了错误范围。在运行项目之前,您需要下载 node.js。 这个患者数据管理项目包含 javascript、node.js 和 CSS。我们必须让服务器监听端口 3000,并使用 JSON 在客户端和服务器之间交换数据。这个项目会不断询问您有关插件更新的信息,因此请保持互联网畅通。此系统允许您执行 crud 操作。在这里,您是系统的管理员。您还可以添加所需的员工人数。此外,您还可以更新患者记录。该系统功能齐全且功能齐全。 要运行此项目,您需要在计算机上安装NodeJS并使用现代浏览器,例如 Google Chrome、  Mozilla Firefox。ReactJS项目中的此项目可免费下载源代码。有关项目演示,请查看下面的图像滑块。 对于手动安装 1.将主项目文件夹解压到任意目录 2.从 cmd 设置项目目录的路径 3. 输入命令“npm install” 4.完成后输入命令“npm start” 5.现在,您将获得一个 localhost:portnumber,并到该 URL 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值