栈和队列面试题

数据结构—栈和队列经典面试题 栈和队列面试题: 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1) 使用两个栈实现一个队列 使用两个队列实现一个栈 元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为 (4,5,3,2,1) 一个数组实现两个栈(共享栈) 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O... 阅读详情

栈和队列实现的代码在链接中的博客中https://blog.youkuaiyun.com/Damn_Yang/article/details/83928852

1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)

思路:我们借助两个栈来进行操作(stack1和stack2)

           入栈时:stack1正常入栈,如果stack2为空或者stack2栈顶的元素大于等于入栈的元素,stack2也入栈

           出栈时:如果stack1栈顶的元素等于stack2栈顶的元素,则stack2出栈。不等于的话,stack1出栈

           返回最小值:返回stack2栈顶的元素

代码实现:

头文件:

#include "Stack.h"
typedef int MstDataType;

typedef struct MinStack
{
	Stack _st;
	Stack _minst;
}MinStack;


void MinStackInit(MinStack* pms);
void MinStackDestory(MinStack* pms);


void MinStackPush(MinStack* pms,MstDataType x);
void MinStackPop(MinStack* pms);

DataType MinStackMin(MinStack* pms);

函数实现

#include"Topic.h"


void MinStackInit(MinStack* pms)
{
	assert(pms);
	StackInit(&pms->_st);
	StackInit(&pms->_minst);

}
void MinStackDestory(MinStack* pms)
{
	assert(pms);
	StackDestory(&pms->_st);
	StackDestory(&pms->_minst);

}

void MinStackPush(MinStack* pms, MstDataType x)
{
	assert(pms);
	StackPush(&pms->_st, x);
	if (StackEmpty(&pms->_minst) == 0 || StackTop(&pms->_minst) >= x)
	{
		StackPush(&pms->_minst, x);
	}
}
void MinStackPop(MinStack* pms)
{
	assert(pms);
	if (StackTop(&pms->_st) == StackTop(&pms->_minst))
	{
		StackPop(&pms->_minst);
	}
	StackPop(&pms->_st);

}

DataType MinStackMin(MinStack* pms)
{
	assert(pms);
	return StackTop(&pms->_minst);
}


void TestMinStack()
{
	MinStack pms;
	MinStackInit(&pms);
	MinStackPush(&pms, 4);
	MinStackPush(&pms, 5);
	MinStackPush(&pms, 3);
	MinStackPush(&pms, 3);
	MinStackPush(&pms, 2);
	MinStackPush(&pms, 3);

	while (StackEmpty(&pms._st) != 0)
	{
		printf("最小值:%d\n", MinStackMin(&pms));
		MinStackPop(&pms);
	}
}

int main()
{
	TestMinStack();
	return 0;
}

2.使用两个栈实现一个队列

这道题在我写的另一篇博客中:https://blog.youkuaiyun.com/Damn_Yang/article/details/84103454

3.使用两个队列实现一个栈

这道题在我写的另一篇博客中:https://blog.youkuaiyun.com/Damn_Yang/article/details/84103454

4.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)

思路:定义一个栈st,入栈序列为in,出栈序列为out,长度分别为insize和outsize。如果两个序列为空或长度不等,则不合法,针对长度相等且不为空的两个序列进行判断。

先将in中第一个元素入栈,然后通过循环使后移。

1、如果当前栈为空且入栈序列不为空,则入栈序列in后移,st入栈。

2、如果栈顶元素不等于出栈序列且入栈序列不为空,则入栈序列in后移,st入栈。

3、如果栈顶元素等于出栈序列,st出栈,出栈序列out后移。

循环比较后,如果栈为空,则出栈序列是合法的,否则是不合法的


//元素出栈 入栈的合法性
int IsLegalStackOrder(int * in, int insize, int*out, int outsize)
{
	assert(in&&out&&insize == outsize);
	Stack st;
	StackInit(&st);
	int inindex = 0;
	int outindex = 0;
	while (inindex < insize)
	{
		StackPush(&st, in[inindex]);
		++inindex;
		while (StackEmpty(&st) && StackTop(&st) == out[outindex])
		{
			StackPop(&st);
			++outindex;
		}
	}
	if (StackEmpty(&st) == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	int in[] = { 1,2,3,4,5 };
	int out[] = { 4,5,3,2,1 };
	if (IsLegalStackOrder(in, 5, out, 5) == 1)
	{
		printf("合法\n");
	}
	else
	{
		printf("不合法");
	}
	
	return 0;
}

5.一个数组实现两个栈(共享栈)

思路:将数组的下标为0的位置当做第一个栈的栈底,下标为1的位置当做第二个栈的栈底,将数组的偶数位置看做第一个栈的存储空间,奇数位置看做第二个栈的存储空间。

代码实现:

ShareStack.h

#include<stdio.h>
#include<assert.h>

#define N 100

typedef int DataType;
typedef struct ShareStack
{
	DataType _a[N];
	int _top1;
	int _top2;

}ShareStack;


void ShareStackInit(ShareStack*pss);
void ShareStackPush(ShareStack*pss,DataType x,int which);
void ShareStackPop(ShareStack*pss);
DataType ShareStackTop(ShareStack*pss, int which);


int ShareStackEmpty(ShareStack*pss,int which);


ShareStack.c

#include"ShareStack.h"


void ShareStackInit(ShareStack*pss)
{
	assert(pss);
	pss->_top1 = 0;
	pss->_top2 = 1;

}
void ShareStackPush(ShareStack*pss, DataType x, int which)
{
	assert(pss);
	if (which == 1)
	{
		pss->_a[pss->_top1] = x;
		pss->_top1 += 2;
	}
	else if (which == 2)
	{
		pss->_a[pss->_top2] = x;
		pss->_top2 += 2;
	}

}

void ShareStackPop(ShareStack*pss,int which)
{
	assert(pss);
	assert(which == 1 || which == 2);
	if (which == 1)
	{
		pss->_top1 -= 2;
	}
	else
	{
		pss->_top2 -= 2;
	}
}
DataType ShareStackTop(ShareStack*pss, int which)
{
	assert(pss);
	assert(which == 1 || which == 2);
	if (which == 1)
	{
		return pss->_a[pss->_top1 - 2];
	}
	else
	{
		return pss->_a[pss->_top2 - 2];

	}
}

int ShareStackEmpty(ShareStack*pss, int which)
{
	assert(pss);
	assert(which == 1 || which == 2);
	if ((pss->_top1 == 0 && which == 1) || (pss->_top2 == 1 && which == 2))
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

TestShareStack()
{
	ShareStack pss;
	ShareStackInit(&pss);
	ShareStackPush(&pss, 1 ,1);
	ShareStackPush(&pss, 2, 1);
	ShareStackPush(&pss, 3, 1);
	ShareStackPush(&pss, 1, 2);
	ShareStackPush(&pss, 2, 2);
	ShareStackPush(&pss, 3, 2);

	while (ShareStackEmpty(&pss, 1))
	{
		printf("%d ", ShareStackTop(&pss, 1));
		ShareStackPop(&pss, 1);
	}
	printf("\n");
	while (ShareStackEmpty(&pss, 2))
	{
		printf("%d ", ShareStackTop(&pss, 2));
		ShareStackPop(&pss, 2);
	}
}

int main()
{
	TestShareStack();
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

关于队列和栈的几道面试题 关于队列和栈的几道面试题今天来说几道简单的栈和队列相关的几道面试题:1 . 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O (1 )第一道题,我们需要分析,我想一般的思维肯定是想到,开辟一块空间,进行保存最小值,这种方法也是大家通常地一下就可以想到的。但是在这里会有一个问题,就是如果你的最小值在栈顶,当你pop了栈顶以后,下面的数据中最小的元素就 阅读详情

相关推荐

TSC条码打印机C#例程(tsclib.dll调用) 【转】

//----program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using System.Runtime.InteropServices;public class TSCLIB_DLL{[DllImport("TSCLIB.dll", EntryPoint = "abou...

weixin_33843947的博客 2440

数据结构选择题——栈和队列

如果P3=1,可知,P3第一个出栈,P3出栈后,栈中剩下P1P2,由出栈顺序可知,P3后一个出栈的数是2,P3后一个出栈的不可能是P1,因此P1一定不为2。队头元素为0,再次入队时,队尾加1,队头不变,因此队头初始为0,队尾每次入队要加1,当空队时应但是n(即入队一个元素后,指向和队头相同位置0)Push进栈,Pop出栈,对于题目进出栈顺序,top原本为-1,其变化为:+1+1-1+1+1-1-1+1+1=3。,n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是()。

weixin_74727063的博客 1584

AFSim仿真系统中的图像处理器:从静态图像到视频流的目标识别技术解析

本文深入解析了AFSim仿真系统中WSF_IMAGE_PROCESSOR图像处理器的核心功能与技术实现。它详细阐述了该处理器如何从静态图像与视频流中完成目标检测、跟踪与识别,将原始像素数据转化为可供指挥系统使用的轨迹情报,并重点介绍了其基于约翰逊准则的目标识别进阶逻辑、关键参数配置以及脚本扩展能力,为构建高逼真度仿真应用提供了实践指导。

cola5的博客 213

栈和队列经典面试题

目录 1、括号匹配问题 2、用队列实现栈 3、用栈实现队列 4、设计循环队列 1、括号匹配问题 链接直达: 有效的括号 题目: 思路: 2、用队列实现栈 3、用栈实现队列 4、设计循环队列 ...

bit_zyx的博客 3412

基于STM32与MPU6050的实时姿态检测系统设计与实现(源码+硬件解析)

本文详细介绍了基于STM32单片机与MPU6050传感器的实时姿态检测系统设计与实现。通过硬件解析、传感器校准、卡尔曼滤波算法和欧拉角计算,实现高精度姿态检测。提供完整源码和调试技巧,适用于无人机、平衡车等嵌入式开发项目,解决噪声干扰和数据漂移等常见问题。

jupi8的博客 493

嘉立创EDA实战:4层板叠层设计避坑指南(附阻抗计算技巧)

本文详细解析了嘉立创EDA在4层PCB叠层设计中的实战技巧与避坑指南,涵盖经典叠层方案对比、介质厚度选择、电源系统设计及高速信号完整性优化。特别介绍了阻抗计算工具的应用,帮助工程师在高速电路设计中实现性能与成本的最佳平衡。

sea99的博客 964

【数据结构】栈和队列选择题和面试编程题

本文重点讲述了数据结构里面的练习题和一些常见的面试题,给出了详细的解析思路,还附有动图,希望可以帮助大家。

m0_63198468的博客 1491

Zemax非序列模式新手入门:从零搭建一个抛物面反射镜系统(含灯丝光源与探测器设置)

本文详细介绍了如何在Zemax非序列模式下从零搭建抛物面反射镜系统,包括灯丝光源配置、反射镜建模和探测器设置等关键步骤。通过实战指南,帮助光学设计新手快速掌握非序列模式的应用技巧,特别适合处理复杂光线传播场景如反射镜系统和杂散光分析。

weixin_28717431的博客 436

数据结构——栈、队列、数组、串の选择题整理

1、设链表不带头结点且所有操作均在表头进行,则下列最不适合作为链栈的是()A、只有表头结点指针,没有表尾指针的双向循环链表B、只有表尾结点指针,没有表头指针的双向循环链表C、只有表头结点指针,没有表尾指针的单向循环链表D、只有表尾结点指针,没有表头指针的单向循环链表对于双向循环链表,找头结点和尾结点都很方便对于单向循环链表,已知头结点,找尾结点需要遍历整个链表,已知尾结点找头结点很方便。栈的存取时间复杂度都是O(1),因此不存在减少存取时间的问题。注意!!!......

王王仙贝的博客 3920

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

ESP32S连接JY61P并通过WIFI把姿态数据发送给电脑1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器;2.电脑接受数据是基于python的;

Doudou_Nai的博客 1131

【数据集2】CPC Global Unified Temperature/Precipitation数据简介及处理

简介CPC 温度及降雨 数据

WW、forever的博客 3105

【数据结构】栈与队列经典选择题

快来看看你的栈与队列学的如何吧!

睿的博客 1710

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

MIKE的模拟结果dfsu文件的数据是可以导出的,导出格式为xyz,我们也可以将其改后缀改为txt文本格式,其中包含了某一时刻下所有网格坐标点的数据。

晏长街的博客 4406

栈和队列经典面试题--(用队列实现栈,设计循环队列)

在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。这里我使用了动态数组去实现循环队列,因为这里循环队列的空间是固定的,所以在循环队列的结构体中加入int k,代表循环队列的长度。这里我们要将有数据的队列除最后一个数据的其他数据导入空队列,队列中的最后一个数据即为栈顶。// 返回 false,队列已满。获取队尾元素和队头有点不一样,因为我们的队尾指针指向的是队尾的下一个元素,如图所示;我们两个栈,一个存储数据,然后倒入到我们另一个栈中,栈顶即为我们所需的队首元素。

wer24_25的博客 2283

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

栈和队列相关面试题

前言: 上篇文章介绍了栈和队列及其相关操作,本篇通过几个面试题,来进一步掌握栈和队列~ 目录括号匹配问题用队列实现栈用栈实现队列实现一个最小栈设计一个循环队列 括号匹配问题 题目:在线OJ 用队列实现栈 题目:在线OJ 用栈实现队列 题目:在线OJ 实现一个最小栈 题目:在线OJ 设计一个循环队列 题目: 在线OJ ...

一朵花花 1188

栈和队列经典面试题解析

本文摘要: 通过两个队列实现栈结构,利用队列的先进先出特性模拟栈的后进先出特性。关键是通过辅助队列实现元素反转,保持一个队列始终为空用于操作中转。提供了完整的C语言实现代码,包含初始化、入栈、出栈等操作。 设计循环队列时使用数组存储,通过头尾指针和取模运算实现环形缓冲。重点解决了队空/队满的判定问题,采用两种方案:记录元素个数或多开一个空间。给出了包含创建、入队、出队等操作的完整实现。 解析了5道经典栈和队列选择题,包括栈的出栈顺序、不可能的出栈序列、循环队列元素计算等题目,通过具体示例说明解题思路和原理。

2301_79479763的博客 843

栈和队列的4道面试题【详细解析】【代码实现】

有关栈和队列的四道面试题的详细解析和代码实现 栈和队列各两道题

aaa114514aaaa的博客 1899

快速掌握栈和队列(含面试题)

【图示】【概念】栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据在栈顶生活中栈的应用:装填子弹时,先填进去的子弹最后发射【总结】栈是一种先进后出的数据结构,底层由数组和一个计数器组成(同顺序表)栈,逻辑上先进后出,物理上连续。

2301_79417489的博客 1194

【面试题】栈和队列的面试题

题目一:实现一个栈,要求其入栈,出栈,返回最小值的时间复杂度为O(1) 这道题目,主要问题在于如何时查找最小元素的时间复杂度为O(1),这里我们先想到了用一个变量存取最小值 在仅仅入栈时,我们可以通过该MinElem这个变量来查找最小值是完全没有问题的; 但是,如果我们进行出栈,并且把该最小值出栈后,那最小值是不是就找不到了; 下面是正确的解法: 这里我们要用两个栈,第一

皓皓松的博客 2505

【数据结构】栈和队列 (栈 栈的概念结构 栈的实现 队列 队列的概念及结构 队列的实现 栈和队列面试题)

栈也是一种线性表,数据在逻辑上挨着存储。只允许在固定的一端进行插入和删除元素。进行插入和删除操作的一端叫栈顶,另一端叫栈底。符合LIFO 先进后出。压栈:插入操作。出栈:删除操作。

m0_68800221的博客 1591

【剑指Offer】面试题:栈和队列

剑指Offer中一共有4道关于栈和队列的面试题 面试题9:用两个栈来实现队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 JS实现:【剑指Offer】面试题9:用两个栈实现队列——JS实现 面试题30:包含min函数的栈 题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数。在该栈中,调用min、push...

Dora_5537的博客 405

栈和队列经典面试题详解

栈和队列经典面试题详解

A13569039691的博客 1544

数据结构 —— 栈和队列的认识及代码实现及面试题

PS:本文将介绍什么是栈和队列以及,顺序栈、队列(顺序队列、循环队列)、链式栈和链式队列的代码实现,以及栈和队列的面试题:两个栈实现一个队列、两个队列实现一个栈 栈 什么是栈? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才...

阿坤~的博客 628
上一篇: 两个栈实现一个队列 两个队列实现一个栈
下一篇: C++string类常用接口说明,深浅拷贝
DamnIU
博客等级 码龄9年 53粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值