数据结构
文章平均质量分 89
wwxjya
这个作者很懒,什么都没留下…
展开
-
用栈实现括号匹配问题
通过观察,我们可以发现,括号匹配的字符串,左括号与右括号数目一定相等;且遇到右括号时,必定有与之相匹配的括号在之前最近出现过。这样,可以整理解决问题的思路如下: 假设有一串带括号的字符串,依次访问每一个字符,遇到左括号入栈;遇到右括号时,取栈顶元素,判断是否与该元素相等,若相等,则出栈;若不相等,则直接返回0;其余情况,皆不做任何操作,直接访问下一个字符,直到遇到‘\...原创 2018-04-10 08:25:33 · 529 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:要求出数组中出现超过一般的数字,也就意味着要统计每个数字出现的次数。可以利用哈希表,定义一个数组,在每个数字下标的地方存放该下标数字出现的次数。这样统计完后,就可以在进行一次...原创 2018-07-11 16:25:41 · 144 阅读 · 0 评论 -
逆序栈(使用递归)
题目:一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。给定一个栈Stack以及栈的大小top,请返回逆序后的栈。解题思路:借助递归,利用辅助函数,在调用辅助函数的函数定义一个栈,用来存放逆序后的结果;在辅助函数内进...原创 2018-07-11 16:21:37 · 634 阅读 · 0 评论 -
二叉树面试题
将二叉查找树变为有序双向链表: 考虑,二叉查找树的特点是左子树比根节点小,根节点又比右子树小。所以要把二叉查找树变为有序的双向链表,就要把左子树连接到它的前一个结点,右子树作为后一个结点,递归的进行下去。如图所示:问题解决: 按照中序遍历二叉树,如果根节点为空,直接返回; 如果左子树为空,修改它的左指针指向上一次访问的结点(*last)(由于是中序遍历,上...原创 2018-05-29 11:44:19 · 202 阅读 · 0 评论 -
实现stack 和queue--模板类、容器适配器
实现stack:在实现栈的时候,我们都是在顺序表上的特定位置插入删除数据,那么在学习了模板类和容器适配器的概念后,就可以很容易的实现栈了。关于模板:https://blog.csdn.net/weixin_40417029/article/details/80345464//stack#pragma once ...原创 2018-05-17 16:51:25 · 158 阅读 · 0 评论 -
实现list-- 模板
实现一个带头结点的双向带环链表:观察这样一个链表(写出代码如下)://List.h#pragma once #include <assert.h>...原创 2018-05-17 16:02:08 · 700 阅读 · 0 评论 -
实现vector--模板
在这里,我把类函数定义与声明分开了:以下是类定义与类函数的声明:// vector.h#pragma once #include <iostream&...原创 2018-05-17 15:48:18 · 552 阅读 · 0 评论 -
C++实现顺序表(数组和链表)
在C++中,引入了类的概念,要用类来实现顺序表,一定要注意代码的复用,这样会使实现更加容易。数组实现顺序表: 定义三个指针,_first指向数组开始位置,_finish指向最后一个元素的下一个位置,_endofstorage指向数组末尾的下一个位置。如图所示,假设数组中有元素1234567:构造函数:让三个指针指向空;typedef int DataType;class ...原创 2018-04-21 15:35:23 · 1713 阅读 · 0 评论 -
一个数组实现两个栈(共享栈)
问题分析:在顺序栈的实现中,元素入栈是从下标为0的位置向上增长的,出栈是通过size--实现的。要想用一个数组实现2个栈,可以除了下标从0开始增长,还同时让另一个栈下标从size-1处开始减少。问题解决:定义top1,top2分别代表2个栈栈顶的下一个位置的下标。栈1入栈时,元素放入top1位置,再使top1++;栈2入栈时,元素放入top2位置,再使top2--。出栈时,栈1 top1--;栈2...原创 2018-04-11 15:38:43 · 364 阅读 · 0 评论 -
使用两个队列实现一个栈
问题分析:观察队列和栈的特点,队列是先进先出的,而栈是先进后出的。也就是说,要使用队列实现一个栈,就是利用队列实现先进后出的规律。当pop元素时,最后一个pop的元素为栈的栈顶元素。问题解决:利用两个队列实现一个栈,当push元素时,push进非空的队列中;当pop元素时,先将元素依次pop出来,并push进另一个空队列中,直到只剩下一个元素。这是直接pop最后一个元素。这样就实现了栈先进后出的特...原创 2018-04-11 15:24:02 · 99 阅读 · 0 评论 -
使用两个栈实现一个队列
问题分析:先观察栈和队列的特点,栈是先进后出的,而队列是先进先出的。也就是说想用栈实现队列,pop元素时一个栈的栈底元素是要pop的队首元素。问题解决:于是,可以用两个栈来实现一个队列。当push元素时,如果已经有元素在队列中,将元素push进非空的栈A中;当pop元素时,先将非空的栈A中的元素依次取栈顶元素,压入另一个空栈B中,在pop栈A,直到栈A中只剩一个元素,直接pop。这样就实现了先进先...原创 2018-04-11 15:07:17 · 131 阅读 · 0 评论 -
最小栈的实现
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值),要求时间复杂度为O(1) 。可以借助两个栈来解决这个问题。一个栈用来存放栈的数据(其栈顶元素即为当前栈的),另外一个用来存放当前栈的最小元素。具体实现方法如下:首先定义该栈:typedef struct MinStack{ SeqStack data; //该栈存放的是当前栈的栈顶元素 SeqStack min...原创 2018-04-11 14:54:12 · 551 阅读 · 0 评论 -
C语言实现二叉树(链式)
一颗二叉树是一个节点的有限集合,是由一个根节点和两个子树构成;每个子树又有两个子树。这两个子树分为左子树和右子树,且顺序不能颠倒。如图,像一个倒着的树一样:它有两种存储方式,一种是顺序存储,一种是链式存储。顺序存储: 对于一棵完全二叉树所有结点按照层序自顶向下,同一层自左向右顺序存入一个顺序表中,如果该节点为空,则存入一个特殊的字符代表NULL。例如: 这就是二叉树的...原创 2018-04-18 21:56:07 · 17769 阅读 · 9 评论 -
元素出栈、入栈顺序的合法性(判断一个字符串是否按照出栈顺序)
假设入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),判断出栈序列是否合法? 实现思路:总的来说就是模拟元素的出入栈过程,并进行判断。首先,判断出栈序列和入栈序列的元素个数是否相等,若不相等,则不合法;若相等,则继续进行判断。其次,遍历入栈序列并依次对元素进行入栈,在入栈每个元素时,都判断是否与出栈序列的index位置元素相等,若相等,出栈该元素,index++;若不相等,则不合...原创 2018-04-10 21:10:56 · 317 阅读 · 0 评论 -
找出字符串中第一个只出现一次的字符
题目:找出字符串中第一个只出现一次的字符输入描述:输入一个非空字符串输出描述:输出第一个只出现一次的字符,如果不存在输出-1示例1输入asdfasdfo输出o解题思路:和找出一个数组中只出现一次的数字方法类似,都是利用哈希表的思想来统计每个字符或数字出现的次数。然后在进行遍历,以返回只出现一次的数字或字符。这个题的难点主要在于要自己设计main函数用来打印结果。值得注意的是,在这种题目中一定要循...原创 2018-07-11 16:49:05 · 409 阅读 · 0 评论