IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 用栈实现队列---用两个栈模拟实现一个队列 -> 正文阅读

[数据结构与算法]用栈实现队列---用两个栈模拟实现一个队列

?入队列:直接将元素放进s1(s1栈顶为模拟队列的队尾);

出队列:如果s2非空,直接让s2出栈(s2栈顶为模拟队列的队头);

? ? ? ? ? ? ?如果s2为空,将s1中所有元素导入s2中,然后让s2出栈。

获取队头元素:找s2;

判空:s1&&s2都是空;

typedef int DataType;
typedef struct stack{
    DataType* array;
    int capacity;
    int top;
}stack;

//栈初始化
void initStack(stack* mystack)
{
    mystack->capacity=3;
    assert(mystack);
    mystack->array=(DataType*)malloc(sizeof(DataType)*mystack->capacity);
    if(mystack->array==NULL)
    {
        return;
    }
    mystack->top=0;
}

//栈判空
bool emptyStack(stack* mystack)
{
    assert(mystack);
    return mystack->top==0;
}

//检查栈是否满
void StackCheckCapacity(stack* ps)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newCapacity = (ps->capacity << 1);

		// 1. 开辟新空间
		DataType* temp = (DataType*)malloc(sizeof(DataType)* newCapacity);
		if (NULL == temp)
			assert(0);

		// 2. 拷贝元素
		memcpy(temp, ps->array, sizeof(DataType)*ps->capacity);

		// 3. 释放旧空间,使用新空间
		free(ps->array);
		ps->array = temp;
		ps->capacity = newCapacity;
	}
}

//入栈
void pushStack(stack* mystack,DataType data)
{
    StackCheckCapacity(mystack);
    assert(mystack);
    mystack->array[mystack->top]=data;
    mystack->top++;

}

//出栈
void popStack(stack* mystack)
{
   assert(mystack);
   mystack->top-=1;

}

//获取栈顶元素
DataType  topStack(stack* mystack)
{
    assert(mystack);
    return mystack->array[mystack->top-1];
}

//销毁栈
void destoryStack(stack* mystack)
{

    assert(mystack);
    if(mystack->array)
    {
        free(mystack->array);
    }
    mystack->top=0;
    mystack->capacity=0;


}


typedef struct {
    stack s1;
    stack s2;

} MyQueue;


//模拟队列初始化
MyQueue* myQueueCreate() {
   MyQueue* mq=(MyQueue*)malloc(sizeof(MyQueue));
    if(mq==NULL)
    {
        assert(0);
        return NULL;
    }
    assert(mq);
    initStack(&mq->s1);
    initStack(&mq->s2);
    return mq;

}

//队列入队
void myQueuePush(MyQueue* obj, int x) {
    assert(obj);
    pushStack(&obj->s1,x);

}

//队列出队
int myQueuePop(MyQueue* obj) {
    assert(obj);
    if(emptyStack(&obj->s2))
    {
      while(!(emptyStack(&obj->s1)))
      {
          pushStack(&obj->s2,topStack(&obj->s1));
          popStack(&obj->s1);
      }

    }
     DataType ele= topStack(&obj->s2);
    popStack(&obj->s2);
    return ele;

}

//获取队头元素
int myQueuePeek(MyQueue* obj) {

    assert(obj);
    if(emptyStack(&obj->s2))
    {
        while(!(emptyStack(&obj->s1)))
      {
          pushStack(&obj->s2,topStack(&obj->s1));
          popStack(&obj->s1);
      }

    }
    return topStack(&obj->s2);


}

//队列判空
bool myQueueEmpty(MyQueue* obj) {
    assert(obj);
    return emptyStack(&obj->s1)&&emptyStack(&obj->s2);

}

//模拟队列的销毁
void myQueueFree(MyQueue* obj) {
    assert(obj);
    destoryStack(&obj->s1);
    destoryStack(&obj->s2);
    free(obj);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:25:52  更:2022-03-17 22:29:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:34:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码