C语言使用顺序栈实现括号匹配问题

一.括号匹配问题共有四种情况:

1.左右括号匹配不正确

2.左括号多于右括号

3.右括号多于左括号

4.左右括号匹配正确

二.我的思路:

使用顺序栈,先初始化栈结构,再实现匹配操作,如果遇到左括号,就入栈,要事先判断栈是否满了,满了就返回,不满就继续入栈。如果遇到右括号,就实现出栈操作,这时要判断栈是否为空,如果为空,说明右括号多于左括号,返回一个值,不为空判断括号是否匹配,匹配和不匹配都要返回值。如果全部匹配,则循环结束后再判断栈是否为空,不为空则左括号还有,右括号已经没有了,说明左括号多于右括号,要有返回值,如果为空,左右括号匹配,返回一个值

三.完整代码:

文件“stack.h”的内容如下:

#define maxsize 100

char c[maxsize];

int top;

//初始化栈

void stackinitiate(int* p)

{

*p = 0;

}

//判断栈是否空

int stackempty(int* p)

{

if (*p == 0)//空栈

return 1;

else

return 0;//不是空栈

}

//元素入栈

void stackpush(int* p, char t)

{

if(*p >= maxsize)

{

printf("栈已满,无法插入\n");

return;

}

else

{

c[*p] = t;

(*p)++;

}

}

//元素出栈判断

int stackout(int* p, char g)

{

if (stackempty(&top))

return -1;//左括号少于右括号

else

if (((c[*p - 1] == '(') && (g == ')')) || ((c[*p - 1] == '[') && (g == ']')) || ((c[*p - 1] == '{') && (g == '}')))

{

(*p)--;

return 1;//括号匹配

}

else

return 0;//括号不匹配

}

//括号匹配

int match(char s[80])

{

int i,a;

for (i = 0; s[i] != '\0'; i++)

{

if ((s[i] == '(') || (s[i] == '[') || (s[i] == '{'))

stackpush(&top, s[i]);//元素入栈

if ((s[i] == ')') || (s[i] == ']') || (s[i] == '}'))

{

a=stackout(&top, s[i]);

if (a == -1)

return 3;//左括号少于右括号

else

if (a == 1)

continue;//暂时满足括号匹配,继续判断

else

return 0;//括号不匹配

}

}

if (stackempty(&top))

return 1;//括号匹配

else

return 2;//左括号多于右括号

}

文件code.c的内容如下(主函数):

#include <stdio.h>

#include "stack.h"

int main()

{

char s[80];

printf("请输入字符串\n");

scanf_s("%s", s, 80);

//初始化栈

stackinitiate(&top);

//括号匹配

int b=match(s);

//判断

if (b == 0)

printf("左括号与右括号不匹配\n");

else

if (b == 2)

printf("左括号多于右括号\n");

else

if (b == 3)

printf("右括号多于左括号\n");

else

printf("括号匹配\n");

return 0;

}

建议在编译器上看,如果有更好的思路和解法,欢迎大家在评论区交流,谢谢

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C语言中可以使用顺序表来实现数组,也可以使用链表来实现动态分配内存的数据结构。如果想要实现哈希表,可以使用结构体数组和链表结合的方式来实现。 对于顺序表实现数组,可以通过定义一个固定长度的数组来存储数据,并且可以通过下标索引来访问数组中的元素。例如: ``` #define MAXSIZE 100 int array[MAXSIZE]; ``` 对于链表实现动态分配内存的数据结构,可以使用结构体来定义每一个节点,并且节点中包含一个指向下一个节点的指针。例如: ``` struct Node { int data; struct Node *next; }; ``` 对于哈希表的实现,可以使用结构体数组来表示哈希表中的每一个元素,每个元素可以包含一个链表,用来存储具有相同哈希值的元素。例如: ``` #define HASHSIZE 100 struct Node { int data; struct Node *next; }; struct HashTable { struct Node *list; }; struct HashTable hashtable[HASHSIZE]; ``` 在使用哈希表时,可以通过计算每个元素的哈希值,将元素存储到对应的链表中。当需要查找元素时,只需要计算出元素的哈希值,然后在对应的链表中查找即可。 ### 回答2: C语言中可以使用顺序栈实现括号匹配。 首先,我们需要定义一个结构体来表示顺序栈,包括栈的最大容量和当前的栈顶指针。可以使用一个一维数组来实现栈的存储。 然后,我们需要实现两个基本的操作:入栈和出栈。入栈操作将一个元素添加到栈的顶部,出栈操作将栈顶的元素移除。 在进行括号匹配时,我们可以遍历输入的字符串中的每个字符。当遇到左括号时,我们将其入栈;当遇到右括号时,我们将其与栈顶元素进行匹配。如果栈顶元素为对应的左括号,则将栈顶元素出栈;否则,表示括号不匹配。 当遍历完所有字符后,如果栈为空,说明所有的括号都匹配成功。如果栈不为空,说明还有未匹配的括号。 以下是一个用C语言实现括号匹配的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义顺序栈结构体 typedef struct { char data[MAX_SIZE]; int top; } Stack; // 初始化栈 void init(Stack *stack) { stack->top = -1; } // 判断栈是否为空 int isEmpty(Stack *stack) { return stack->top == -1; } // 入栈 void push(Stack *stack, char c) { if (stack->top == MAX_SIZE - 1) { printf("Stack is full\n"); return; } stack->data[++(stack->top)] = c; } // 出栈 char pop(Stack *stack) { if (isEmpty(stack)) { printf("Stack is empty\n"); return '\0'; } return stack->data[(stack->top)--]; } // 括号匹配 int matchBrackets(char *str) { Stack stack; init(&stack); int i = 0; while (str[i] != '\0') { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { push(&stack, str[i]); } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { if (isEmpty(&stack)) { return 0; } char topChar = pop(&stack); if ((str[i] == ')' && topChar != '(') || (str[i] == ']' && topChar != '[') || (str[i] == '}' && topChar != '{')) { return 0; } } i++; } return isEmpty(&stack); } int main() { char *str = "[()]{}{[()()]()}"; if (matchBrackets(str)) { printf("括号匹配成功\n"); } else { printf("括号匹配失败\n"); } return 0; } ``` 以上示例中,我们使用了一个字符数组来表示输入的字符串,并定义了一个`Stack`结构体来实现顺序栈。在`matchBrackets`函数中,我们遍历输入字符串的每个字符,并根据字符的类型进行相应的操作。最后,根据栈是否为空来判断括号是否匹配成功,并输出结果。 注意,在实际应用中,我们可能还需要处理其他的情况,如字符不是括号或者存在其他字符等。这里的示例只是简单地实现括号匹配的基本逻辑。 ### 回答3: C语言可以用顺序栈实现括号匹配。首先,我们需要定义一个存储括号的顺序栈结构,其中包含一个数组用来存放括号元素,以及一个指针top来指示栈顶位置。 当开始遍历表达式时,我们遇到左括号时,将其入栈,当遇到右括号时,我们将比较栈顶元素与当前括号是否匹配。如果匹配,则弹出栈顶元素,继续遍历;如果不匹配,表明括号不匹配,直接返回不匹配的结果。 在遍历完成后,如果栈为空,则说明所有括号都匹配成功,如果栈不为空,则说明有括号没有匹配成功,返回括号不匹配的结果。 以下是用C语言实现括号匹配的代码: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 50 typedef struct { char data[MAX_SIZE]; int top; } Stack; void init(Stack *stack) { stack->top = -1; } bool isEmpty(Stack *stack) { return stack->top == -1; } void push(Stack *stack, char c) { if(stack->top == MAX_SIZE - 1) { printf("Stack overflow!\n"); return; } stack->data[++(stack->top)] = c; } char pop(Stack *stack) { if(isEmpty(stack)) { printf("Stack underflow!\n"); return '\0'; } return stack->data[(stack->top)--]; } bool isMatching(char left, char right) { if(left == '(' && right == ')') return true; else if(left == '[' && right == ']') return true; else if(left == '{' && right == '}') return true; else return false; } bool isBalanced(char expression[]) { Stack stack; init(&stack); for(int i = 0; expression[i] != '\0'; i++) { if(expression[i] == '(' || expression[i] == '[' || expression[i] == '{') { push(&stack, expression[i]); } else if(expression[i] == ')' || expression[i] == ']' || expression[i] == '}') { if(isEmpty(&stack) || !isMatching(pop(&stack), expression[i])) { return false; } } } return isEmpty(&stack); } int main() { char expression[MAX_SIZE]; printf("请输入一个表达式:"); scanf("%s", expression); if(isBalanced(expression)) { printf("括号匹配成功!\n"); } else { printf("括号匹配失败!\n"); } return 0; } ``` 在这个实现中,我们用init()函数初始化了栈,用isEmpty()函数判断栈是否为空,用push()函数将元素入栈,用pop()函数弹出栈顶元素。isMatching()函数用来判断两个括号是否匹配。isBalanced()函数用来检查整个表达式的括号是否匹配。在主函数中,我们首先输入一个表达式,然后调用isBalanced()函数判断括号是否匹配,并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值