数据结构用c语言实现括号匹配问题
时间: 2023-11-26 11:45:34 浏览: 244
数据结构可以用C语言实现括号匹配问题。括号匹配问题是指在一个字符串中,括号是否成对出现。如果括号成对出现,则匹配成功,否则匹配失败。可以使用栈来解决该问题。具体实现方法如下:
1. 遍历字符串,如果遇到左括号,则将其入栈;如果遇到右括号,则将栈顶元素出栈,并判断是否匹配。
2. 如果栈为空,但还有右括号,则匹配失败;如果遍历完字符串后,栈不为空,则匹配失败。
3. 如果左右括号匹配,则继续遍历字符串;如果不匹配,则匹配失败。
4. 最后,如果栈为空,则匹配成功;否则匹配失败。
下面是一个用C语言实现括号匹配问题的代码示例:
<<引用>>
相关问题
使用c语言实现括号匹配
下面是使用C语言实现括号匹配的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义栈结构体
typedef struct {
char data[MAX_SIZE]; // 数组存储栈元素
int top; // 栈顶指针
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack *s, char c) {
if (isFull(s)) {
printf("Stack is full!\n");
exit(1);
}
s->data[++s->top] = c;
}
// 出栈
char pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
exit(1);
}
return s->data[s->top--];
}
// 括号匹配函数
int match(char *exp) {
Stack s;
initStack(&s);
char c;
while (*exp) {
switch (*exp) {
case '(':
case '[':
case '{':
push(&s, *exp);
break;
case ')':
if (isEmpty(&s) || pop(&s) != '(')
return 0;
break;
case ']':
if (isEmpty(&s) || pop(&s) != '[')
return 0;
break;
case '}':
if (isEmpty(&s) || pop(&s) != '{')
return 0;
break;
default:
break;
}
exp++;
}
return isEmpty(&s); // 如果栈为空则表示括号匹配成功
}
int main() {
char exp[MAX_SIZE];
printf("Enter an expression: ");
scanf("%s", exp);
if (match(exp))
printf("Matching succeeded!\n");
else
printf("Matching failed!\n");
return 0;
}
```
代码中使用了栈的数据结构来实现括号匹配,遍历输入的表达式,当遇到左括号时,将其入栈,当遇到右括号时,从栈中弹出一个元素并与之匹配,如果匹配成功则继续遍历,否则返回匹配失败。最后判断栈是否为空,如果栈为空则表示括号匹配成功,否则匹配失败。
C语言实现括号匹配代码
C语言实现括号匹配代码的实现通常需要使用栈这种数据结构来完成。具体的实现步骤如下:
1. 遍历字符串,如果遇到左括号(包括小括号、中括号、大括号),则将其入栈。
2. 如果遇到右括号,则取出栈顶元素,与当前的右括号进行匹配。如果匹配成功,则继续遍历;如果匹配失败,则说明括号不匹配,返回错误。
3. 遍历完字符串后,如果栈为空,则说明所有的括号都匹配成功;否则说明还有未匹配的括号,返回错误。
下面是一个简单的C语言实现括号匹配代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
char data;
struct node *next;
} Node;
typedef struct stack {
Node *top;
} Stack;
Stack *initStack() {
Stack *s = (Stack *)malloc(sizeof(Stack));
s->top = NULL;
return s;
}
int isEmpty(Stack *s) {
return s->top == NULL;
}
void push(Stack *s, char c) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = c;
node->next = s->top;
s->top = node;
}
char pop(Stack *s) {
if (isEmpty(s)) {
return '\0';
}
Node *node = s->top;
char c = node->data;
s->top = node->next;
free(node);
return c;
}
char peek(Stack *s) {
if (isEmpty(s)) {
return '\0';
}
return s->top->data;
}
int match(char a, char b) {
return (a == '(' && b == ')') || (a == '[' && b == ']') || (a == '{' && b == '}');
}
int isValid(char *s) {
int len = strlen(s);
Stack *stack = initStack();
for (int i = 0; i < len; i++) {
char c = s[i];
if (c == '(' || c == '[' || c == '{') {
push(stack, c);
} else if (c == ')' || c == ']' || c == '}') {
char top = peek(stack);
if (isEmpty(stack) || !match(top, c)) {
return 0;
}
pop(stack);
}
}
int result = isEmpty(stack);
free(stack);
return result;
}
int main() {
char s[100];
scanf("%s", s);
if (isValid(s)) {
printf("Valid\n");
} else {
printf("Invalid\n");
}
return 0;
}
```
阅读全文