C语言实现括号匹配

总体思路:最里面的左括号与最右边的同类型右括号始终为一对,从最左边的左括号开始依次向两边的括号进行比较便达到匹配括号的目的
学过数据结构的同学应该很清楚,这个用(先进栈的元素先出栈)这种数据结构就很容易达到目的,当然其他方式也行,这里我主要介绍使用栈完成括号匹配的方法


/*以下为Bracket1函数,可以处理三种括号匹配,请补充完整程序*/
//关于栈的相关方法在文章末尾
int Bracket1(char *str )

{
	/*以下填写正确的程序段*/
	Sqstack S;
	int a;
	Initstack(&S);
	fgets(str, 256, stdin);//该函数充键盘输入最多256个字符,并存入str所指向的字符串中
	int k = strlen(str);
	for (int i = 0; i <k ; i++)
	{
		char ch = str[i];
		ElemType target;
		switch (ch) {
		case'{':
		case'[':
		case '(':
			a = ch;
			Push(&S,&a);
			break;

		case ')':
			Pop(&S, &target);
			if (target != '(') {
				//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!",i,ch);
				return 0;
			}
			break;
		case '}':
			Pop(&S, &target);
			if (target != '{') {
				//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!", i, ch);
				return 0 ;
			}
			break;
		case']':
			Pop(&S, &target);
			if (target != '[') {
				//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!", i, ch);
				return 0; 
			}
			break;

		}

	}
	return StackEmpty(&S);
	/*填写结束*/
}

栈的顺序存储方式(数组实现)的动态结构:

typedef int ElemType;
typedef struct stack
{
	 int maxSize;//栈的最大容量,
 	 ElemType *data;
	 int top;//top指针失踪指向该栈data的顶部
}Sqstack;

栈的顺序存储方式的静态结构:

typedef int ElemType;
typedef struct stack
{
	 int maxSize;
 	 ElemType data[maxSize];
	 int top;//top指针失踪指向该数组data的顶部
}Sqstack;

栈的链式存储结构

typedef int ElemType;
typedef struct stack
{
	 struct stack* next;//指向下一个节点的指针
 	 ElemType data;
	 //如果使用链式存储结构,那么表头节点便是指向栈顶的指针
}LinkStack;

这里用到的相关方法(以顺序存储结构为例):


int Push(Sqstack *L,ElemType *e)   /*元素*e进栈,进栈成功,函数返回1*/
{
  /*以下插入正确的代码*/
  if(L->top == L->maxSize){
    int k = sizeof(ElemType);
	L->data = realloc(L->data,2*k*L->maxSize);//如过元素溢出,使栈的容量扩大一倍
	L->maxSize =2*L->maxSize; 
	}
	L->data[L->top] = *e;
	L->top++;
  /*代码插入结束*/
  return 1;
}

int Pop(Sqstack *L,ElemType *e)  /*从栈顶出栈一个元素,并存在*e中,成功返回1*/
{
  /*以下插入正确的代码*/
	if (L->top == 0) {
		printf("栈已为空!!\n");
		return 0;
	}
	*e = L->data[--L->top];
  /*代码插入结束*/
  return 1;
}
  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值