#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][MAX2]; //用来保存数据
int top; //用来记录栈顶位置,初始值为-1,为0时表示该栈中有一个元素。
}Stack;
void initStack(Stack s){
s->top = -1;
}
void Push(Stacks, chardata){
s->top++;
strcpy(s->data[s->top], data);
}
char* Pop(Stacks){
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)))"
4、express="12-33)",是非法的表达式,有两个连续的,函数返回false;
5、express="12-3*",是非法的表达式,后面没有操作数了,函数返回false;
6、express="12-35 53)",是非法的表达式,操作数5与5之间,缺少操作符,函数返回false;
等等。
/
bool completeParentese(char express, char result){
int i;char ch
stack ope,vals;
initStack(&ope);
initStack(&vals);
for(i=0;express[i]!='\0';i++)
{
if(express[i]=='');
{ Push(&ope,'(')
for(j=0;j<=i;j++)
{
Push(&ope,express[j]);
}
}
}
}
int main(){
printf("请输入缺少左括号的表达式.\n");
char express[MAX]={0};
char result[MAX*2]={0};
gets(express);
bool bResult = completeParentese(express, result);
if(bResult){
printf("补齐左括号之后的表达式为:%s\n", result);
} else{
printf("转换失败,输入的表达式可能不合法");
}
return 0;
}
使用堆栈实现,碰到左括号入栈,右括号出栈。
1、如果堆栈为空表示匹配;
2、如果堆栈不为空表示多了左括号;
3、如果出栈为空表示多了右括号;
参考
#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--]; //返回为一个二维数组的行首地址;
}
bool completeParentese(char *express, char *result)
{
Stack ope,vals;
initStack(&ope);
initStack(&vals);
int i = 0, n, k, m, t=0;
char expre[50]; //接收上数字和再次压入栈内的()表达式;
while (express[i] != '\0')
{
if (express[i] == '+' || express[i] == '-' || express[i] == '*' || express[i] == '/') // 为操作符时,;入栈
{
if (t==0)
return false;
t=0;
expre[0] = express[i];
expre[1] = '\0';
Push(&ope, expre);
}
else if ('0' <= express[i] && express[i] <= '9')
{
if (t!=0)
return false;
t=1;
k=0;
while ('0' <= express[i] && express[i] <= '9') //当操作数为123 这样的类型时;
{
expre[k] = express[i];
i++;
k++;
}
expre[k]='\0';
Push(&vals, expre); //将数字压入栈;
i--;
}
else if (express[i]==')') //当遇到 ')'
{
if (t==0)
return false;
t=2;
//取一个操作符加一个操作数 + '()'构成 新的操作数;
expre[0] = '(';
expre[1] = '\0';
char *t1 = Pop(&vals);
char *t2 = Pop(&vals);
strcat(expre, t2);
strcat(expre, Pop(&ope));
strcat(expre, t1);
strcat(expre, ")");
Push(&vals,expre);
}
i++;
}
if (t==0)
return false;
i = 0;
strcat(result, vals.data[i]);
while (i<=ope.top)
{
strcat(result, ope.data[i]);
strcat(result, vals.data[i+1]);
i++;
}
return true;
}
int main()
{
printf("请输入缺少左括号的表达式.\n");
char express[MAX] = {0};
char result[MAX * 2] = {0};
gets(express);
bool bResult = completeParentese(express, result);
if (bResult)
{
printf("补齐左括号之后的表达式为:%s\n", result);
}
else
{
printf("转换失败,输入的表达式可能不合法");
}
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!