**问题描述**
编写一栈程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。
例如: 给定输入:
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