【leetcode】20.Valid Parentheses(C)

Description:

Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.

Example1:

Input: “()”
Output: true

Example2:

Input: “()[]{}”
Output: true

Example3:

Input: “(]”
Output: false

Example4:

Input: “([)]”
Output: false

Example5:

Input: “{[]}”
Output: true

[ 题目链接 ]

解题方法: 用栈来做
提交代码:

typedef struct
{
	char brackets[10000];
	int top;
}stack;


void initStack(stack* s)
{
	for (int i = 0; i < 100; i++)
		s->brackets[i] = '0';
	s->top = -1;
}

void pushStack(stack* s, char c)
{
	s->brackets[++s->top] = c;
}

char popStack(stack* s)
{
	char tmp = s->brackets[s->top];
	s->brackets[s->top] = '0';
	s->top--;
	return tmp;
}

bool isValid(char* s) 
{
	char c;
	stack* st=(stack*)malloc(sizeof(stack));
	initStack(st);

	for (int i = 0; s[i] != '\0'; i++)
	{
		c = s[i];
		if (c == '(' || c == '{' || c == '[')
			pushStack(st, c);
		else
		{
            if (st->top == -1)	return false;
			char tmp = popStack(st);
			if (c == ')'&&tmp == '(')
				continue;
			else if (c == '}'&&tmp == '{')
				continue;
			else if (c == ']'&&tmp == '[')
				continue;
			else
				return false;
		}
	}
	if (st->top != -1)
		return false;
	return true;
}

运行结果:
在这里插入图片描述

代码优化:
参考

其实只要有栈的思想就可以了,不用特意再建立栈结构和栈的函数,显得很冗余;
另外参考中录入字符的方式也值得学习。我的代码中是[for循环+变量i],显得很冗余,参考中作者的方式是 [while(*s)和s++],这样就比较清楚明了


结构(struct)的使用:
在链表中,标准的定义方式:

typedef struct Head List_Head;
typedef struct Node List;

struct Head {
	int length;
	List* next;
};

struct Node {
	int data;
	List* pre;
	List* next;
};

首先是struct建立一个结构,但是后续的使用会比较麻烦,比如要定义一个结点:

struct Node newnode;

这样看起来不明了,所以可以在整个struct结构前面的加入这一句:

typedef struct Node List;

这样后面申明一个结点的时候就是:

List newnode;

这样看起来会比较简单清楚。

这里要注意的是typedef语句和struct结构在这里不能联合起来使用,即不能这么写:

typedef struct 
{
	int data;
	List* pre;
	List* next;
}List;

因为在结构定义的内部,有List* pre这个语句,这个语句是在List结构定义完成之前申明的,这个时候编译器还不知道List是什么类型,所以会报错

在栈中,标准的结构定义方式:

typedef struct
{
	char brackets[10000];
	int top=-1;
}stack;

这样直接typedef+struct结构就可以了,因为栈的内部定义不需要用到指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值