C语言用栈的数据结构判断括号是否匹配

C语言用栈的数据结构判断括号是否匹配

栈的结构体及栈的基本操作

(栈的代码我写在名为”SqStack.h"的头文件里)

#pragma once
#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 10


//结构体
typedef struct SqStack {
	char data[MAXSIZE];
	int top;
}SqStack;

//创建
bool initSqStack(SqStack*& S) {
	S = (SqStack*)malloc(sizeof(SqStack));
	if (S == NULL)
		return false;
	S->top = -1;
}

//消除
void destoryStack(SqStack*& S) {
	free(S);
}

//判空
bool isEmpty(SqStack* S) {
	if (S->top == -1) {
		return true;
	} else {
		return false;
	}
}
//判满
bool isFull(SqStack* S) {
	if (S->top == MAXSIZE - 1)
		return true;
	else
		return false;
}
//入栈
bool push(SqStack*& S, char e) {
	if (isFull(S)) {
		return false;
	}
	S->top++;
	S->data[S->top] = e;
	return true;
}

//出战
bool pop(SqStack*& S, char& e) {
	if (isEmpty(S)) {
		return false;
	}
	e = S->data[S->top];
	S->top--;
	return true;
}


//获得栈顶元素
bool getTop(SqStack* S, char& e) {
	if (S == NULL) {
		return false;
	}
	e = S->data[S->top];
}



//遍历
bool printStack(SqStack* S) {
	if (S == NULL) {
		return false;
	}
	for (int i = 0; i < S->top; i++) {
		printf("%c",S->data[i]);
	}
	printf("%c\n", S->data[S->top]);
	return true;
}

//获取长度
int getLength(SqStack* S) {
	return S->top++;
}

//以默认值初始化顺序栈
SqStack* createSqStack(int length) {
	SqStack* S;
	initSqStack(S);
	for (int i = 0; i < length; i++) {
		push(S, i);
	}
	return S;
}

判断括号是否匹配

(代码写在“bracketMatching.h"的头文件里)

1.判断逻辑

在这里插入图片描述

2.代码

#pragma once
#include"SqStack.h"

//判断字符串的长度
int length(char str[]) {
	if (str == NULL) {
		printf("字符串为空\n");
		return -1;
	}
	int i = 0;
	while (str[i] != NULL) {
		i++;
	}
	return i;
}
//判断左右符号类型是否匹配
bool isTypeMatched(char src, char target) {
	switch (src) {
	case ')':
		if (target == '(') {
			return true;
		}else {
			printf("%c前是%c,不匹配\n", src, target);
			return false;
		}
		break;
	case '}':
		if (target == '{') {
			return true;
		} else {
			printf("%c前是%c,不匹配\n", src, target);
			return false;
		}
		break;
	case ']':
		if (target == '[') {
			return true;
		} else {
			printf("%c前是%c,不匹配\n", src, target);
			return false;
		}
		break;
	default:
		return false;
		break;
	}
}
//判断字符串是否匹配括号
bool isMatched(char str[]) {
	if (str == NULL) {
		printf("字符串为空\n");
		return false;
	}
	SqStack* s;
	initSqStack(s);
	for (int i = 0; i < length(str); i++) {
		char topElem;
		switch (str[i]) {
		case '(':
		case '[':
		case '{':
			push(s, str[i]);
			break;
		case ')':
		case '}':
		case ']':
			if (pop(s,topElem)){
				if (isTypeMatched(str[i], topElem)) {

				} else 	{
					return false;
				}
			} else {
				printf("%c前无元素\n", str[i]);
				return false;
			}
		default:
			break;
		}
	}
	if (isEmpty(s)) {
		return true;
	} else {
		printf("栈空,左括号不匹配\n");
		return false;
	}

}

测试

#include"bracketMatching.h"

void main() {
	char str[] ="()((()))";
	if (isMatched(str))
		printf("匹配");
}

下面是项目目录
项目目录

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种常用的数据结构,可以用来实现括号匹配。下面是一个使用C语言代码实现来进行括号匹配的示例: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 100 // 定义结构 typedef struct { char data[MAX_SIZE]; int top; } Stack; // 初始化 void initStack(Stack *s) { s->top = -1; } // 判断是否为空 bool isEmpty(Stack *s) { return s->top == -1; } // 判断是否已满 bool isFull(Stack *s) { return s->top == MAX_SIZE - 1; } // 入 void push(Stack *s, char c) { if (isFull(s)) { printf("Stack is full.\n"); return; } s->data[++(s->top)] = c; } // 出 char pop(Stack *s) { if (isEmpty(s)) { printf("Stack is empty.\n"); return '\0'; } return s->data[(s->top)--]; } // 括号匹配函数 bool isParenthesesMatch(char *str) { Stack s; initStack(&s); for (int i = 0; str[i] != '\0'; i++) { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { push(&s, str[i]); } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { if (isEmpty(&s)) { return false; } char top = pop(&s); if ((str[i] == ')' && top != '(') || (str[i] == ']' && top != '[') || (str[i] == '}' && top != '{')) { return false; } } } return isEmpty(&s); } int main() { char str[MAX_SIZE]; printf("请输入括号序列:"); scanf("%s", str); if (isParenthesesMatch(str)) { printf("括号匹配成功!\n"); } else { printf("括号匹配失败!\n"); } return 0; } ``` 这段代码中,我们使用一个字符数组来存储输入的括号序列,然后通过遍历序列中的每个字符,将左括号入,遇到右括号时与顶元素进行匹配。如果匹配成功,则继续遍历;如果匹配失败或者为空,则括号匹配失败。最后判断是否为空,如果为空则括号匹配成功,否则匹配失败。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值