当前位置: 首页 > news >正文

【数据结构】栈与队列面试题(C语言)

我们再用C语言做题时,是比较不方便的,因此我们在用到数据结构中的某些时只能手搓或者Ctrl+cv

我们这里用到的栈或队列来自栈与队列的实现

目录

  • 有效的括号
    • 解题思路:
    • 代码实现:
  • 用队列实现栈
    • 解题思路:
    • 代码实现:
  • 用栈实现队列
    • 解题思路:
    • 代码实现:

有效的括号

有效的括号,链接奉上。
在这里插入图片描述

解题思路:

先说结论
因为我们是在讲栈与队列的面试题,故当然此题用栈或者队列做最为合适
但是为什么会想到使用栈与队列呢?
这就要求我们对数据结构具有比较高的熟悉度,看到题目就会想出比较恰当的应对措施,这与我们的做题程度也密不可分

利用的特性,当有左括号出现时,需要压栈,有右括号出现时pop出左括号进行匹配
在这里插入图片描述
解决完最主要的问题就可以逐步探测一些比较不容易被发现的坑点
,我会在代码实现中一步一步带大家深入

代码实现:

bool isValid(char* s) 
{Stack st;StackInit(&st);while(*s){if(*s == '{' || *s == '[' || *s == '('){StackPush(&st, *s);}else{char tmp = StackTop(&st);StackPop(&st);if(!(*s == '}' && tmp == '{'|| *s == ']' && tmp == '['|| *s == ')' && tmp == '(')){StackDestroy(&st);return false;}}s++;}StackDestroy(&st);return true;
}

写完之后我们提交,发现:在这里插入图片描述
这就说明我们应当在加一个判断,当栈中有剩余时,说明数量不匹配

    if(StackSize(&st) > 0){StackDestroy(&st);return false;}

继续提交,发现当只有一个右括号时,因为会top,而栈用又没有元素,所以报错,我们继续加一个判断
在这里插入图片描述
加的位置在while中的else

            if(StackSize(&st) == 0){StackDestroy(&st);return false;}

完整代码:

bool isValid(char* s) 
{Stack st;StackInit(&st);while(*s){if(*s == '{' || *s == '[' || *s == '('){StackPush(&st, *s);}else{if(StackSize(&st) == 0){StackDestroy(&st);return false;}char tmp = StackTop(&st);StackPop(&st);if(!(*s == '}' && tmp == '{'|| *s == ']' && tmp == '['|| *s == ')' && tmp == '(')){StackDestroy(&st);return false;}}s++;}if(StackSize(&st) > 0){StackDestroy(&st);return false;}StackDestroy(&st);return true;
}

用队列实现栈

在这里插入图片描述
用队列实现栈,链接奉上

解题思路:

在这里插入图片描述

代码实现:

typedef struct 
{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() 
{MyStack* head = (MyStack*)malloc(sizeof(MyStack));QueueInit(&head->q1);QueueInit(&head->q2);return head;
}void myStackPush(MyStack* obj, int x) 
{Queue empty = obj->q1;if(!QueueEmpty(&empty))QueuePush(&obj->q1, x);elseQueuePush(&obj->q2, x);
}int myStackPop(MyStack* obj) 
{Queue* emptyq = &obj->q1;Queue* nonemptyq = &obj->q2;if(!QueueEmpty(emptyq)){emptyq = &obj->q2;nonemptyq = &obj->q1;}while(QueueSize(nonemptyq) > 1){QueuePush(emptyq, QueueFront(nonemptyq));QueuePop(nonemptyq);    }int tmp = QueueFront(nonemptyq);QueuePop(nonemptyq);return tmp;
}int myStackTop(MyStack* obj) {Queue* emptyq = &obj->q1;Queue* nonemptyq = &obj->q2;if(!QueueEmpty(emptyq)){emptyq = &obj->q2;nonemptyq = &obj->q1;}return QueueBack(nonemptyq);
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

用栈实现队列

在这里插入图片描述

用栈实现队列

解题思路:

与上一题类似,可以将两个栈来回导,最终实现

代码实现:

typedef struct {Stack s1;Stack s2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* ret = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&ret->s1);StackInit(&ret->s2);return ret;
}void myQueuePush(MyQueue* obj, int x) {if(!(StackEmpty(&obj->s1))){StackPush(&obj->s2, x);}else{StackPush(&obj->s1, x);}
}int myQueuePop(MyQueue* obj) {MyQueue* emptys = &obj->s1; MyQueue* nonemptys = &obj->s2; if(!StackEmpty(&obj->s1)){emptys = &obj->s2; nonemptys = &obj->s1; }while(StackSize(nonemptys) > 1){StackPush(emptys, StackTop(nonemptys));StackPop(nonemptys);}int ret = StackTop(nonemptys);StackPop(nonemptys);while(StackSize(emptys)){StackPush(nonemptys, StackTop(emptys));StackPop(emptys);}return ret;
}int myQueuePeek(MyQueue* obj) {MyQueue* emptys = &obj->s1; MyQueue* nonemptys = &obj->s2; if(!StackEmpty(&obj->s1)){emptys = &obj->s2; nonemptys = &obj->s1; }while(StackSize(nonemptys) > 1){StackPush(emptys, StackTop(nonemptys));StackPop(nonemptys);}int ret = StackTop(nonemptys);StackPush(emptys, StackTop(nonemptys));StackPop(nonemptys);while(StackSize(emptys)){StackPush(nonemptys, StackTop(emptys));StackPop(emptys);}return ret;
}bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->s1) && StackEmpty(&obj->s2);
}void myQueueFree(MyQueue* obj) {StackDestroy(&obj->s1);StackDestroy(&obj->s1);free(obj);
}

遇到问题可以及时与博主沟通,定知无不言,言无不尽

相关文章:

  • 矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例
  • 机器学习第8天:SVM分类
  • 【论文阅读】A Survey on Video Diffusion Models
  • Linux--网络概念
  • ZJU Beamer学习手册(二)
  • 全志XR806基于http的无线ota功能实验
  • 创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(十)
  • android开发连接网络
  • Leetcode—141.环形链表【简单】
  • csapp深入理解计算机系统 bomb lab(1)phase_1
  • Redis数据的持久化
  • SpringCloud Alibaba详解
  • NoSQL 与传统数据库的集成
  • WPF中如何在MVVM模式下关闭窗口
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • CSS实用技巧干货
  • HTML5新特性总结
  • Java Agent 学习笔记
  • js 实现textarea输入字数提示
  • python_bomb----数据类型总结
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • use Google search engine
  • 闭包--闭包之tab栏切换(四)
  • 动态规划入门(以爬楼梯为例)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 软件开发学习的5大技巧,你知道吗?
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 新书推荐|Windows黑客编程技术详解
  • 学习Vue.js的五个小例子
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 云大使推广中的常见热门问题
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • postgresql行列转换函数
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #define,static,const,三种常量的区别
  • #pragma multi_compile #pragma shader_feature
  • (5)STL算法之复制
  • (c语言)strcpy函数用法
  • (C语言)逆序输出字符串
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (ZT)一个美国文科博士的YardLife
  • (备忘)Java Map 遍历
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm码农论坛 毕业设计 231126
  • (六)Hibernate的二级缓存
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .pyc文件是什么?
  • ::前边啥也没有
  • :O)修改linux硬件时间
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @NoArgsConstructor和@AllArgsConstructor,@Builder