补全括号表达式(C语言实现)

该博客介绍了如何编写一个C语言程序,实现从标准输入读取一个缺少左括号的数学表达式,并将其转换为补全左括号的中序表达式。程序通过使用两个栈来处理操作数和运算符,遵循中缀表达式的规则。文章提供了详细的代码实现和错误检查,包括非法字符、操作数缺失和非法操作符等情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**问题描述**

编写一栈程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。

例如: 给定输入:

1+2 ) \*3-4) \*5-6)))

补齐左括号之后的表达式为:((1+2)\*((3-4)\*(5-6)))

**基本要求及提示**

(1)初始化栈s。

(2)从键盘输入一个缺少左括号的表达式,并打印出补全括号之后的中序表达式。

**其他说明**

输入的字符只允许为数字、空格、+、-、\*、/、),长度不得超过MAX

补全左括号后的中序表达式。转换时,需要将空格过滤掉。即:result中不会出现空格字符。

举例说明: 1、输入="123 + 123",是一个正确的表达式,且有空格,因此,转换后,result="123+123"

2、输入="123 + 123)",且有空格,因此,转换后,result="(123+123)"

3、输入="1+2)\*3-4) \*5-6 ) ) )",且有空格,因此,转换后,result="((1+2)\*((3-4)\*(5-6)))"

4、输入="12-3\*\*3)",是非法的表达式,有两个连续的\*\*,函数返回false;

5、输入="12-3\*",是非法的表达式,*后面没有操作数了,函数返回false;

6、输入="12-5 5\*3)",是非法的表达式,操作数5与5之间,缺少操作符,函数返回false;

等等。

代码实现

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<malloc.h>

#define bool char

#define true 1

#define false 0

#define MAX 50 //定义输入的缺少左括号的表达式的最大长度

typedef struct Stack{

    char data[MAX][MAX*2]; //用来保存数据

    int top; //用来记录栈顶位置,初始值为-1,为0时表示该栈中有一个元素。

}Stack;

void  initStack(Stack* s){

    s->top = -1;

}

void Push(Stack*s, char*data){

    s->top++;

    strcpy(s->data[s->top], data);

}

char* Pop(Stack*s){

    return s->data[s->top--];

}

/*

TODO:完成给表达式补充左括号的功能。

函数功能:将一个缺少左括号的表示式,转换成补全左括号的中序表达式。

参数说明: express-需要被转换的缺少左括号的表达式。只允许为数字、空格、+、-、*、/、),长度不得超过MAX

           result-补全左括号后的中序表达式。转换时,需要将空格过滤掉。即:result中不会出现空格字符。

返回值说明:true-如果能成功转换,则返回true。

            false-否则,返回false。表示转换出错或输入的表达式非法。

举例说明: 1、express="123 + 123",是一个正确的表达式,且有空格,因此,转换后,result="123+123"

           2、express="123 + 123)",且有空格,因此,转换后,result="(123+123)"

           3、express="1+2)*3-4) *5-6 ) ) )",且有空格,因此,转换后,result="((1+2)*((3-4)*(5-6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值