两个队列实现一个栈

article/2025/8/27 16:22:54

两个栈实现一个队列

    • 1.主要思想
    • 2.结构设计
    • 3.基本操作
      • (1)初始化
      • (2)入栈
      • (3)获取栈顶第一个元素的值,但不删除
      • (4)获取栈顶第一个元素的值并删除
      • (5)判空
      • (6)判满
      • (7)获取队列有效元素个数
      • (8)清空
      • (9)销毁
    • 4.完整代码

1.主要思想

栈的特点:先进后出。队列的特点:先进先出。
我们在用两个队列实现栈的时候是用顺序队列。
在这里插入图片描述

2.结构设计

既然是用两个队列实现栈的操作,所以定义的结构体中的成员就是两个队列。

typedef struct
{SqQueue q1;SqQueue q2;
}TQStack, *PTQStack;

3.基本操作

  1. 我们要实现的是一个栈,所以所有的操作都是基于栈的基础上,栈有什么操作,我们实现的就有什么操作。
  2. 我们用两个队列实现栈的操作中,队列的所有操作是给定的,在我们实现栈的过程中,只需要调用其函数即可(见顺序队列)。

(1)初始化

void my_InitStack(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return;Init_Queue(&ptq->q1);Init_Queue(&ptq->q2);
}

(2)入栈

哪个队列不空就入哪个队列。

bool my_Push(PTQStack ptq, int val)
{assert(ptq != NULL);if (ptq == NULL)return false;if (!IsEmpty(&ptq->q1)){return Push(&ptq->q1,val);}else{return Push(&ptq->q2, val);}
}

(3)获取栈顶第一个元素的值,但不删除

栈顶的元素就是队列尾的元素,要将队列尾部的元素得到,就需要将其他元素一次存放进另一个队列中保存。

bool my_GetTop(PTQStack ptq, int* rtval)
{assert(ptq != NULL && rtval != NULL);if (ptq == NULL || rtval == NULL)return false;if (!IsEmpty(&ptq->q1))//如果q1不空,就将q1中的元素只留一个,其他的都存入q2中。最后一个数就是栈顶元素;{while (Get_length(&ptq->q1) > 1){int tmp = 0;Pop(&ptq->q1, &tmp);Push(&ptq->q2, tmp);}return Get_top(&ptq->q1, rtval);}else{while (Get_length(&ptq->q2) > 1){int tmp = 0;Pop(&ptq->q2, &tmp);Push(&ptq->q1, tmp);}return Get_top(&ptq->q2, rtval);}
}

(4)获取栈顶第一个元素的值并删除

bool my_Pop(PTQStack ptq, int* rtval)
{assert(ptq != NULL && rtval != NULL);if (ptq == NULL || rtval == NULL)return false;if (!IsEmpty(&ptq->q1)){while (Get_length(&ptq->q1) > 1){int tmp = 0;Pop(&ptq->q1, &tmp);Push(&ptq->q2, tmp);}return Pop(&ptq->q1, rtval);}else{while (Get_length(&ptq->q2) > 1){int tmp = 0;Pop(&ptq->q2, &tmp);Push(&ptq->q1, tmp);}return Pop(&ptq->q2, rtval);}
}

(5)判空

bool my_IsEmpty(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return false;return IsEmpty(&ptq->q2)&& IsEmpty(&ptq->q1);
}

(6)判满

我们在入队是时,是向栈1中入的,如果栈1满了,再向栈2中入就堵住下一个要出的元素了,所以在判满时,只需要判断栈1满不满即可。

bool my_IsFull(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return false;if (!IsEmpty(&ptq->q1)){return(IsFull(&ptq->q1));}else{return(IsFull(&ptq->q2));}
}

(7)获取队列有效元素个数

int my_Get_length(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return -1;if (!IsEmpty(&ptq->q1)) { return Get_length(&ptq->q1);}return Get_length(&ptq->q2);
}

(8)清空

void my_Clear(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return;Clear(&ptq->q2);Clear(&ptq->q1);
}

(9)销毁

void my_Destroy(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return;Destroy(&ptq->q2);Destroy(&ptq->q1);
}

4.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef struct
{SqQueue q1;SqQueue q2;
}TQStack, *PTQStack;void my_InitStack(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return;Init_Queue(&ptq->q1);Init_Queue(&ptq->q2);
}//入栈
bool my_Push(PTQStack ptq, int val)
{assert(ptq != NULL);if (ptq == NULL)return false;if (!IsEmpty(&ptq->q1)){return Push(&ptq->q1,val);}else{return Push(&ptq->q2, val);}
}//判满
bool my_IsFull(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return false;if (!IsEmpty(&ptq->q1)){return(IsFull(&ptq->q1));}else{return(IsFull(&ptq->q2));}
}//判空
bool my_IsEmpty(PTQStack ptq)
{return IsEmpty(&ptq->q2)&& IsEmpty(&ptq->q1);
}//获取栈首的值
bool my_GetTop(PTQStack ptq, int* rtval)
{assert(ptq != NULL && rtval != NULL);if (ptq == NULL || rtval == NULL)return false;if (!IsEmpty(&ptq->q1)){while (Get_length(&ptq->q1) > 1){int tmp = 0;Pop(&ptq->q1, &tmp);Push(&ptq->q2, tmp);}return Get_top(&ptq->q1, rtval);}else{while (Get_length(&ptq->q2) > 1){int tmp = 0;Pop(&ptq->q2, &tmp);Push(&ptq->q1, tmp);}return Get_top(&ptq->q2, rtval);}
}//出栈
bool my_Pop(PTQStack ptq, int* rtval)
{assert(ptq != NULL && rtval != NULL);if (ptq == NULL || rtval == NULL)return false;if (!IsEmpty(&ptq->q1)){while (Get_length(&ptq->q1) > 1){int tmp = 0;Pop(&ptq->q1, &tmp);Push(&ptq->q2, tmp);}return Pop(&ptq->q1, rtval);}else{while (Get_length(&ptq->q2) > 1){int tmp = 0;Pop(&ptq->q2, &tmp);Push(&ptq->q1, tmp);}return Pop(&ptq->q2, rtval);}
}//获取有效长度
int my_Get_length(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return -1;if (!IsEmpty(&ptq->q1)) { return Get_length(&ptq->q1);}return Get_length(&ptq->q2);
}//清空
void my_Clear(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return;Clear(&ptq->q2);Clear(&ptq->q1);
}//销毁
void my_Destroy(PTQStack ptq)
{assert(ptq != NULL);if (ptq == NULL)return;Destroy(&ptq->q2);Destroy(&ptq->q1);
}

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


http://chatgpt.dhexx.cn/article/lXowaA7A.shtml

相关文章

面试题:用两个队列实现一个栈

在做这道题之前&#xff0c;我们首先要搞清楚队列和栈的特点。 队列:先进先出&#xff0c;即插入数据在队尾进行&#xff0c;删除数据在队头进行&#xff1b; 栈&#xff1a;后进先出&#xff0c;即插入与删除数据均在栈顶进行。 POP&#xff1a; 如果我们要实现一个栈&…

Prescan(五):prescan与simulink的连接

1. prescan界面 打开matlab&#xff0c;其中matlab需要从prescan manager中打开 在打开前需要确保是否在prescan中设置了正确的matlab路径 2. matlab界面 本例程中以摄像头为传感器&#xff0c;做一个简要的展示&#xff0c;生成如下所示的车辆&#xff0c;就是仿真环境中在pr…

prescan8.5安装教程(详细)

一、简介 PreScan是一个用于先进驾驶辅助系统和主动安全系统开发验证的仿真工具&#xff0c;系统釆用传感器监测车辆的周围环境并使用获得的信息釆取行动&#xff0c;这类行动可以是警告司机回避潜在的危险&#xff0c;也可以使通过自动刹车或自动转向主动回避危险。 PreScan可…

prescan里的TIS传感器

文章目录 About the TISTIS Nomenclature(TIS术语)TIS Dialog Tabs(TIS对话框选项卡)TIS Scan Patterns行扫描Z扫描Z扫描波束 矩阵扫描 TIS Computational Limitations&#xff08;TIS计算限制&#xff09;TIS Accuracy&#xff08;TIS Accuracy&#xff09;Sensor Assignment&…

prescan8.5 百度网盘下载链接及安装过程

prescan8.5 安装教程 含百度网盘下载链接 下载地址&#xff1a; 链接 安装过程: 1、下载软件安装包后双击打开…\PreScan8.5\aTsitePreSc850\TASS.International.PreScan.8.5.0.Win64-SSQ目录下的PreScan-8.5.0-win64.exe 2、在打开的Setup – Prescan安装界面中点击 Next…

Prescan测试场景和工况的建模方法,导入功能

Prescan中的仿真分为以下四大模块 1.场景工况 2.环境感知 3.决策算法 4.执行器 场景工况 对于环境工况&#xff0c;Prescan提供Traffic element Database 其中包括134 Demo Scenarios Euro NCAP *11 NHTSA * 12 ISO * 19 ADAC * 9 DMAPI Data importing openDRIVE Data …

prescan和carsim联合仿真中出现的一些问题以及解决方法

Prescan和carsim都天然能和simulink联合仿真&#xff0c;于是就在simulink中联合起来。 由于比较熟悉prescan的simulink仿真&#xff0c;因此联合过程看作&#xff1a; 在carsim中生成比较精密的车辆动力学模型&#xff0c;并且在prescan中替换掉。 准备工作&#xff0c;下载…

Adaptive Cruise Control (ACC) Test Scenarios(PreScan里面的ACC)

文章目录 Adaptive Cruise Control (ACC) Test Scenarios PreScan scenario models available with the ACC system ACC模型的几个预扫描场景可用&#xff1a; 真实生活场景–系统的典型用例 ISO测试协议 这些模型展示了如何使用PreScan对ADAS系统进行建模&#xff0c;并提供“…

[Prescan]Prescan中Sensor学习

文章目录 1. Idealized Sensor1.1 GPS接收器1.2 AIR Sensor 执行器信息传感器1.3 Beacon/OBU 2. Detailed Sensor2.1 Camera Sensor2.2 Fish eye Camera2.3 Lidar2.4 Radar Sensor2.4 Ultrasonic Sensor 3. Ground Truth Sensor3.1 Lane Marker Sensor3.2 Analytical Lane Mark…

PreScan 学习问题总结

prescan_01 安装 PreScan 选择Matlab 版本时&#xff0c;提示版本不匹配 忽略即可&#xff0c; 安装matlab需要对应的语言编译软件和对应版本&#xff0c; 查询路径如下&#xff1a; https://ww2.mathworks.cn/support/requirements/previous-releases.html prescan 和 mat…

Prescan8.5安装详细教程

Prescan8.5软件安装详细教程 Win10 64位 PreScan是西门子公司旗下汽车驾驶仿真软件产品&#xff0c;Prescan是以物理模型为基础&#xff0c;开发ADAS和智能汽车系统的仿真平台。支持摄像头、雷达、激光雷达、GPS&#xff0c;以及V2V/V2I车车通讯等多种应用功能的开发应用。 Pr…

Prescan入门教程之避坑笔记:初学者初用

建立项目文件 打开prescan软件后界面如下&#xff1a; 点击其工作界面的左上角file&#xff0c;一般来初用需新建自己的项目文件夹即点击new experiment&#xff0c;可以自定义文件位置&#xff0c;也可以使用软件默认位置&#xff1b;当然&#xff0c;如果你已经是老司机&am…

PreScan自带泊车模型

prescan有自带的泊车例子 停车辅助系统的功能目标是帮助驾驶员找到空停车位&#xff0c;并通过全自动应用程序&#xff08;转向和油门/制动器&#xff09;帮助驾驶员驶入停车位。这些系统设计用于提高停车操作期间的安全性和驾驶员舒适度。为本演示设计的算法首先收集有关车…

PreScan第一课:软件简介和基础

为了自己和他人学习的需要&#xff0c;建了一个PreScan的QQ群&#xff1a;613469333&#xff08;已满&#xff09;/ 778225322&#xff08;可加&#xff09;&#xff0c;加群前请私聊群主&#xff08;QQ&#xff1a;2059799865&#xff09;加入。群管理需要花费时间和精力&…

Prescan学习笔记

一、 prescan新建场景&#xff08;Experiment&#xff0c;快捷键CtrlN&#xff09; 可设定保存路径&#xff0c;给仿真预设特定的计算频率&#xff0c;作者名称以及简单的场景模型描述 二、场景建模工作 鼠标滚轮可实现画布的缩放&#xff0c;摁住滚轮可实现平移画布 搭建场…

Prescan-行人识别

前面提到了摄像头实现的PCW-行人碰撞预警&#xff08;Pedestrian Collision Warning&#xff09;功能&#xff0c;在此用Prescan做个简单的示例&#xff0c;步骤如下&#xff1a; 1、场景创建 要求场景至少具有一辆车&#xff0c;一条道路&#xff0c;一个行人&#xff0c;然…

Prescan(二):从0到1使用prescan搭建仿真物理环境模型

1. 一句话概括prescan&#xff1f; PreScan 是以物理模型为基础&#xff0c;支持多种传感器&#xff0c;基于simulink开发的 ADAS 和自动驾驶仿真软件。 2. prescan怎么下载&#xff1f; 可以向官方申请lisence使用试用版&#xff0c;需要公司账号申请&#xff1b;其他渠道&…

Prescan-功能预览

鉴于这两年无人驾驶炒的火热&#xff0c;想学习点基础知识&#xff0c;以免被淘汰。然而囊中羞涩&#xff0c;Jetson TX2、Lidar。。。只可远观&#xff0c;由于本人从事过汽车结构设计及3D设计和仿真软件技术支持&#xff0c;同时会点C/C#/Python&#xff0c;考虑工作贴合度&a…

【暂时完结】Prescan学习笔记

因个人学习暂不会用到Prescan&#xff0c;关于Prescan的学习笔记暂时停止更新&#xff0c;有兴趣的同学可参见下面网址。 以下资料是对B站上学习视频的整理&#xff0c;主要来源&#xff1a;https://space.bilibili.com/268138391/&#xff0c;大家一起学习哦 Prescan学习记录…

PreScan笔记(1)——入坑之简单介绍和Demo

文章目录 PreScan 小白入坑1. PreScan简单介绍2. First Demo简单介绍实验的基本四步具体流程与MATLAB连接过程中的问题 参考 PreScan 小白入坑 本人最近才接触PreScan&#xff0c;最近也略微熟悉了GUI和相关步骤。先给自己定个目标&#xff0c;之后每学一点就写一点。 PreSca…