有效的括号(C语言实现)

题目描述

 

思路

这道题可以用栈的方法,先进后出,在栈内存储一个括号,再将栈内数据和字符比较,判断错误还是正确

解题方法

第一步:实现栈
第二步:将字符存入栈内
第三步:将栈内数据和下一个字符比较,判断括号是否匹配
第四步:清空栈内数据,继续比较

 代码实现

typedef int STDateType;

typedef struct Stack
{
	STDateType* _a;
	int _top;//栈顶下标
	int _capacity;
}Stack;

//初始化数据
void StackInit(Stack* pst);
//销毁数据
void StackDestory(Stack* pst);
//入栈
void StackPush(Stack* pst, STDateType x);
//出栈
void StackPop(Stack* pst);
//获取栈内数据个数
int StackSize(Stack* pst);

//返回1是空,返回0是非空
int StackEmpty(Stack* pst);
//获取栈顶数据
STDateType StackTop(Stack* pst);

//初始化数据
void StackInit(Stack* pst)
{
	assert(pst);

	pst->_a = (STDateType*)malloc(sizeof(STDateType) * 4);
	pst->_top = 0;
	pst->_capacity = 4;

}
//销毁数据
void StackDestory(Stack* pst)
{
	assert(pst);
	free(pst->_a);
	pst->_a = NULL;
	pst->_top = pst->_capacity = 0;
}
//入栈
void StackPush(Stack* pst, STDateType x)
{
	assert(pst);

	if (pst->_top == pst->_capacity)
	{
		pst->_capacity *= 2;
		STDateType* tmp = (STDateType*)realloc(pst->_a, sizeof(STDateType) * (pst->_capacity));
		if (tmp==NULL)
		{
			printf("内存不足\n");
			exit(-1);
		}
		else
		{
			pst->_a = tmp;
		}

	}
	pst->_a[pst->_top] = x;
	pst->_top++;
}
//出栈
void StackPop(Stack* pst)
{
	assert(pst);
	assert(pst->_top > 0);
	pst->_top--;
}
//获取栈内数据个数
int StackSize(Stack* pst)
{
	assert(pst);
	return pst->_top;
}
//返回1是空,返回0是非空
int StackEmpty(Stack * pst)
{
	assert(pst);

	/*return pst->_top ==0 ? 1 : 0;*/
	return !pst->_top;
}
//获取栈顶数据
STDateType StackTop(Stack* pst)
{
	assert(pst);
	assert(pst->_top > 0);

	return pst->_a[pst->_top - 1];
}


//以下是正式解答
bool isValid(char* s) {
  Stack st;
  StackInit(&st);//初始化数据
  bool ret;
  while(*s)
  {
    if(*s=='('||*s=='{'||*s=='[')//判断字符是否为前括号
    {
      StackPush(&st,*s);//如果是前括号则入栈
      s++; 
    }
    else
    {
       if(StackEmpty(&st))//如果只有一个括号的情况
       {
        ret=false;
        break;
       }

      char top=StackTop(&st);//将栈顶数据记录
      //比较栈内的括号和字符是否匹配,不匹配则退出
      if(*s==')'&& top!='(')
       {
        ret=false;
        break;
       }
      if(*s=='}'&& top!='{')
       {
        ret=false;
        break;
       }
      if(*s==']'&& top!='[')
       {
        ret=false;
        break;
       }
       StackPop(&st);//将栈内数据排出
       s++; 
    }  

  }

if(*s=='\0')//如果字符为空时,判断站内数据
{
    ret=StackEmpty(&st);
}

 StackDestory(&st);//销毁数据,否则会出现内存泄漏

    return ret;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值