【c语言】两个栈实现一个队列

2023-10-26

两个栈实现一个队列

在这里插入图片描述
核心思想:模拟出队列先进先出的数据结构
假设有两个栈input和output,input模拟栈的数据插入,当需要模拟出队列操作时,input栈中的A,B,C,D会按照D,C,B,A的顺序进入栈output。 只要output栈不为空,出队列操作就可以通过output的出栈操作来实现。
若output栈为空,则继续从input栈导入数据。
若两个栈都为空,即整个队列为空。

代码模拟:
Queueby_two_stack.h

#pragma once

typedef int DataType;

typedef struct Stack
{
	DataType* Data;
	//有效元素个数
	int size;
	//栈的容量个数
	int capacity;
}Stack;

typedef struct Queue
{
	Stack input;
	Stack output;
	//有效元素个数
	int size;
}Queue;

//初始化函数
void QueueInit(Queue *queue);
//销毁函数
void QueueDestory(Queue *queue);
//入栈函数
void QueuePush(Queue *queue, DataType value);
//出栈函数
void QueuePop(Queue *queue);
//取栈顶元素函数
DataType QueueFront(Queue *queue);

Queueby_two_stack.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "Queueby_two_stack.h"

void StackInit(Stack* stack,DataType capacity)
{
	if (stack == NULL)
	{
		assert(0);
		return -1;
	}
	stack->capacity = capacity;
	stack->size = 0;
	stack->Data = (DataType*)malloc(sizeof(DataType)* stack->capacity);
}

//栈销毁函数
void StackDestory(Stack* stack)
{
	if(stack == NULL)
	{
		assert(0);
		return -1;
	}
	free(stack->Data);
	stack->Data = NULL;
	stack->capacity = 0;
	stack->size = 0;
}

//入栈操作
void StackPush(Stack* stack,DataType value)
{
	if (stack == NULL)
	{
		assert(0);
		return -1;
	}
	if (StackFull(stack))
	{
		int new_capacity = stack->capacity * 2;
		DataType *newDate = (DataType *)malloc(sizeof(DataType) * new_capacity);
		if (newDate == NULL)
		{
			assert(0);
		}
		for (int i = 0; i < stack->size; ++i)
		{
			newDate[i] = stack->Data[i];
		}
		stack->Data = newDate;
		stack->capacity = new_capacity;
	}
	else
	{
		stack->Data[stack->size + 1] = value;
		stack->size++;
	}
}

int StackFull(Stack* stack)
{
	if(stack == NULL)
	{
		assert(0);
		return -1;
	}
	if (stack->size == stack->capacity)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int StackEmpty(Stack* stack)
{
	if (stack == NULL)
	{
		assert(0);
		return -1;
	}
	if (stack->size == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//出栈操作
int StackPop(Stack* stack)
{
	if (stack == NULL)
	{
		assert(0);
		return -1;
	}
	if(stack->size == 0)
	{
		return ;
	}
	stack->size--;
}

//取栈顶元素
DataType StackGetTop(Stack* stack)
{
	if (stack == NULL)
	{
		assert(0);
		return -1;
	}
	if (stack->size == 0)
	{
		return ; 
	}
	else
	{
		return stack->Data[stack->size-1];
	}
}

//队列初始化函数
void QueueInit(Queue* queue,DataType capacity)
{
	if (queue == NULL)
	{
		assert(0);
	}
	StackInit(&queue->input,capacity);
	StackInit(&queue->output, capacity);
	queue->size = 0;
}

//队列销毁函数
void QueueDestory(Queue *queue)
{
	if (queue == NULL)
	{
		assert(0);
	}
	StackDestory(&queue->input);
	StackDestory(&queue->output);
	queue->size = 0;
}

//入队列函数
void QueuePush(Queue *queue, DataType value)
{
	if (queue == NULL)
	{
		assert(0);
		return -1;
	}
	StackPush(&queue->input, value);
	queue->size++;
}

//出队列函数
void QueuePop(Queue* queue)
{
	if (queue == NULL)
	{
		assert(0);
		return -1;
	}
	if (StackEmpty(&queue->output))
	{
		if (StackEmpty(&queue->input))
		{
			return ;
		}
		else
		{
			int newsize = queue->input.size;
			for(int i = 0;i< newsize;++i)
			{
				DataType tmp = StackGetTop(&queue->input);
				StackPop(&queue->input);
				StackPush(&queue->output,tmp);
			}
		}
	}
	StackPop(&queue->output);
	queue->size--;

}

//取队首元素函数
DataType QueueFront(Queue* queue)
{
	if (queue == NULL)
	{
		assert(0);
		return -1;
	}
	if (StackEmpty(&queue->output))
	{
		if (StackEmpty(&queue->input))
		{
			return ;
		}
		else
		{
			int newsize = queue->input.size;
			for (int i = 0; i <newsize ; ++i)
			{
				DataType tmp = StackGetTop(&queue->input);
				StackPop(&queue->input);
				StackPush(&queue->output, tmp);
			}
		}
	}
	return StackGetTop(&queue->output);
}
int main()
{
	Queue queue;
	QueueInit(&queue,10);
	//入队列函数测试
	QueuePush(&queue, 1);
	QueuePush(&queue, 2);
	QueuePush(&queue, 3);
	QueuePush(&queue, 4);
	QueuePop(&queue);
	DataType tmp = QueueFront(&queue);
	printf("%d \n", tmp);
	system("pause");
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【c语言】两个栈实现一个队列 的相关文章

  • H5活动页面遇到的坑+微信分享代码

    h5活动页面功能 在手机上微信分享 1 上传两张图片 2 播放一个背景音乐 很简单是么 那说明你知道的太少了 其实里面的坑好多 一下是制作的心路历程 坑1 iphone上传照片的时候 因为有oriten的原因 所以传上去旋转了 坑2 安卓a
  • Linux rpm命令查询软件包(-q、-qa、-i、-p、-l、-f、-R)

    使用 rpm 做查询命令的格式如下 root localhost rpm 选项 查询对象 rpm q 查询软件包是否安装 用 rpm 查询软件包是否安装的命令格式为 root localhost rpm q 包名 q 表示查询 是 quer
  • 【wpf,C#】wpf调用winform的chart空间,把数据显示成表格曲线

    背景 用wpf想把数据在显示在图表 以一条曲线展示的时候 发现出了问题 wpf不像winform 直接就有chart控件 所以就花了点精力 学会了怎么调用chart控件 最终是为了把数据能够以图表曲线的形式展示出来 当然 wpf还有其他显示

随机推荐

  • IO数据流

    IO流主要是分为字节流和字符流 他们最大的区别是操作的数据单元不同 字节流操作的数据单元占8位 字符流操作的数据单元占16位
  • 【STM32】 工程

    WRITE IN FRONT 介绍 謓泽 正在路上朝着 攻城狮 方向 前进四 荣誉 2021 2022年度博客之星物联网与嵌入式开发TOP5 TOP4 2021 2022博客之星TOP100 TOP63 阿里云专家博主 掘金优秀创作者 全网
  • 线段树板子

    include
  • TreeMap 排序

    一 TreeMap TreeMap 默认排序规则 按照key的字典顺序来排序 升序 当然 也可以自定义排序规则 要实现Comparator接口 用法简单 先看下下面的demo public class SortDemo public sta
  • Java课题笔记~Element UI

    Element 是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库 用于快速构建网页 Element 提供了很多组件 组成网页的部件 供我们使用 例如 超链接 按钮 图片 表格等等 如下图左边的是我们编写页面看到的按钮 上图右边的
  • Redis3.0 集群搭建

    redis3 0 部仅提供了哨兵监控 热切换 还提供了集群解决方案 接下来简单的搭建redis3 0集群 1 新建三个redis server实例 我们可以将redis conf分别copy到7001 7002 7003的文件夹中 并修改相
  • easyui-datagrid获取行和列数据

    1 获取当前行 var row dg datagrid getSelected 2 获取所有选中行 var rows dg datagrid getSelections 3 获取所有行 var rows dg datagrid getRow
  • 安卓11上的存储权限问题

    这篇文章 想来发布的有些晚了 安卓11已经发布多时了 关于安卓11上的存储权限变更的文章数不胜数 所以这篇文章只做为自己的一个简单的记录吧 在说11之前 我们先回忆以下10上存储权限的变更 每个应用会生成自己对应的沙盒文件路径 自己的应用只
  • 计算机基础相关知识面试题

    之前写过一篇面试题 但是在春招面试 笔试问了很多计算机网络 数据结构 操作系统等相关知识点记点之前总结的还是不够参考的 再来一篇 顺序有点乱 但是每一个都是参考的 已备大家复习使用吧 文章目录 UDP 传输控制协议 和TCP 用户数据报协议
  • Redis——初识Redis

    Redis简介 Redis的数据结构致力于帮助用户解决问题 而不是像关系型数据库那样 要求用户扭曲问题来适应数据库 除此之外 通过复制 持久化和客户端分片 client side sharding 等特性 用户可以很方便的将Redis扩展成
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十八)Gamma校正

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 其原地址如下 https learnopengl cn github io 05 20Advanced 20Lighting 01 20Advanced 20Lighti
  • 编写一个golang websocket示例

    示例代码 创建一个websocket对象 var ws websocket Dial ws localhost 8000 echo http localhost 发送消息 if err ws Send byte hello world er
  • Latex编译中文出现的问题

    Latex编译中文出现的问题 记录一下使用latex编译中文遇到的一些问题 本文是在win11系统下使用的TexStudio MikTex组合 编译使用的是pdfLatex 编辑器的设置 首先会发现 编辑器中的中文字符全是乱码 这时 在Te
  • 应用于标签的伪类选择器(link、visited、active、hover)

    CSS3根据选择符的用途可以把选择器分为标签选择器 类选择器 ID选择器 全局选择器 组合选择器 继承选择器和伪类选择器等 伪类选择符定义的样式最常应用于 a 标签上 它表示4种不同的状态 link 未访问链接 visited 已访问链接
  • GnuWin32的安装与使用

    使用过Linux的伙计估计都会喜欢上linux各种各样强大的命令如 find vim cp mv wget curl grep ls等等 而GnuWin32使windows用户可以在命令行窗口中使用各种各样的linux命令 就跟使用普通的w
  • lighttpd不支持Expect: 100-continue的解决办法

    由于lighttpd1 4 21之前的版本不支持Expect 100 continue 所以有可能访问出现 HTTP 1 1 417 Expectation Failed 等错误提示 搜集整理了很多解决方法 如下 1 升级到 lighttp
  • Chrome:将禁用修改document.domain以放宽同源策略

    你好 我是tiantian 几天前 Chrome developer 博客发布了这么一篇文章 大致意思是 Chrome未来将禁用修改document domain 如果你的网站依赖于设置document domain 来解决跨域的问题 那么
  • ubuntu安装elasticsearch和head插件(所有可能出现的问题解决)超详细

    一 单例安装 首先去官网 elastic co 下载tar gz的压缩包 或者使用命令行下载 wget https artifacts elastic co downloads elasticsearch elasticsearch 6 7
  • 当鼠标光标放在一张图片上,如何显示另一张图片?

    我们会遇到一种情境 这种情境是当正常打开一个页面 有文字配有图片 可是当鼠标的光标移动到这张图片上时 会显示另一张图片 这种效果应该怎么做 在学习html和css阶段的程序员 我们可以使用hover来对图片进行处理 hover的基本意思为选
  • 【c语言】两个栈实现一个队列

    两个栈实现一个队列 核心思想 模拟出队列先进先出的数据结构 假设有两个栈input和output input模拟栈的数据插入 当需要模拟出队列操作时 input栈中的A B C D会按照D C B A的顺序进入栈output 只要outpu