C语言实现左括号补齐

#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-3
5 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;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img