详解栈和队列面试题(C语言版),含动图和思路分析

本文通过实战案例深入解析了使用C语言实现栈和队列的方法,包括括号匹配问题、栈与队列的相互转换及循环队列的设计。

✨✨大家好呀!博主这几天正在用C语言学习简单的数据结构😇😇
🌀🌀刚好学习到了栈和队列,学了这么久,想着能不能找几道题来做做😥😥
🌝🌝虽说用C语言做题着实很痛苦💫💫,被小小地打击了一下😟😟
🐸🐸但也加深了博主对数据结构的理解,下面整理了几道栈和队列的题与大家分享。🌏🌏

山外青山楼外楼,自然探秘永无休
成功易使人陶醉,莫把百尺当尽头

在这里插入图片描述

😊0.前言😊

前提知识:
C语言实现栈和队列

💥1.栈和队列面试题💥

🌎1.1 括号匹配问题🌎

题目链接
思路分析:初始化栈,如果是左括号就入栈,如果是右括号就出栈一个左括号元素,出栈了之后与右括号进行匹配,如果不匹配就return false,匹配就继续比。如果左右括号的数量不相等怎么办呢?只要在最后判断一下栈是否为空就行了,栈为空return true;栈不为空,return false;另外只有右括号时也要单独判断一下,因为只有右括号,栈就是空了,此时再出栈就越界了。
💫友情提醒,return之前别忘了free哦,防止内存泄漏,养成好习惯。💫
在这里插入图片描述

//C语言实现栈
/******************************************************************************************/
typedef char STDataType;

typedef struct Stack
{
   
   
	STDataType* a;
	int top;		// 栈顶的位置
	int capacity;	// 容量
}ST;

void StackInit(ST* ps);
void StackDestory(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
bool StackEmpty(ST* ps);
STDataType StackTop(ST* ps);


void StackInit(ST* ps)
{
   
   
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

void StackDestroy(ST* ps)
{
   
   
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

void StackPush(ST* ps, STDataType x)
{
   
   
	assert(ps);
	if (ps->top == ps->capacity)
	{
   
   
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		ps->a = (STDataType*)realloc(ps->a, newCapacity* sizeof(STDataType));
		if (ps->a == NULL)
		{
   
   
			printf("realloc fail\n");
			exit(-1);
		}

		ps->capacity = newCapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

void StackPop(ST* ps)
{
   
   
	assert(ps);
	assert(ps->top > 0);
	--ps->top;
}

bool StackEmpty(ST* ps)
{
   
   
	assert(ps);
	return ps->top == 0;
}

STDataType StackTop(ST* ps)
{
   
   
	assert(ps);
	assert(ps->top > 0);

	return ps->a[ps->top - 1];
}
/******************************************************************************************/


//做题
bool isValid(char * s)
{
   
   
    ST st;
    StackInit(&st);
    while(*s)
    {
   
   
        //如果是左括号就入栈
        if(*s == '[' || *s == '(' || *s == '{')
        {
   
   
            StackPush(&st, *s);
            ++s;
        }
        else
        {
   
   
            //只有右括号,匹配失败
            if(StackEmpty(&st))
            return false;
            
            //如果是右括号,出栈一个左括号进行匹配
            char top = StackTop(&st);
            StackPop(&st);
            if((*s==']' && top !='[')
            ||(*s=='}' && top !='{')
            ||(*s==')' && top !='('))
            {
   
   
                //匹配失败,return false,return之前销毁栈防止内存泄漏
                StackDestroy(&st);
                return fal
评论 40
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuucho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值