当前位置: 首页 > news >正文

力扣用队列实现栈

自己写的栈,再让其他函数去调用自己写的栈

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;//单链表QDataType data;//放数据
}QNode;typedef struct	Queue
{QNode* phead;//头节点QNode* ptail;//尾节点QDataType size; //统计有多少节点
}Queue;void QueueInit(Queue *pq);//初始化  
void QueueDestroy(Queue*pq);//销毁
void QueuePush(Queue*pq,QDataType x);//插入数据
void QueuePop(Queue* pq);//队头出数据就是删队头
QDataType QueueFront(Queue* pq);//返回对头数据
QDataType QueueBack(Queue* pq);//返回队尾数据
int QueueSize(Queue* pq);//返回总的数据个数
bool QueueEmpty(Queue* pq);//是空的返回真void QueueInit(Queue* pq)//初始化 
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(Queue* pq)//销毁
{assert(pq);//第一个结构体QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void QueuePush(Queue* pq, QDataType x)//插入数据
{ QNode* newnode = (QNode*)malloc(sizeof(QNode));//扩大的是第一个结构体if (newnode == NULL){perror("malloc");return;}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}void QueuePop(Queue* pq)//队头出数据就是删队头
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead->next  == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--; 
}QDataType QueueFront(Queue* pq)//返回对头数据
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}QDataType QueueBack(Queue* pq)//返回队尾数据
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}int QueueSize(Queue* pq)//返回总的数据个数
{assert(pq);return pq->size;
}bool QueueEmpty(Queue* pq)//是空的返回真
{assert(pq);return pq->phead == NULL && pq->ptail == NULL; 
}

1.一个结构体包含俩个队列

typedef struct {Queue q1;//第一个队列Queue q2;//第二个队列
} MyStack;

2.希望创造一个包含两个队列的结构体,并且把这样的结构返回去,通过MyStack结构体一把molloc两个队列结构体


MyStack* myStackCreate() {MyStack*obj = (MyStack*)malloc(sizeof(MyStack));if(obj == NULL){perror("molloc");}QueueInit(&obj->q1);QueueInit(&obj->q2);return obj;
}

3.插入数据,q1队列有数据就进入(if语句)把新数据插入q1队列,q1队列没数据就把新数据插入q2队列,若是两个队列都是空就把新数据随便入一个队列

  //插入数据
void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x); }
}

4.用两个队列像一个要像一个栈一样出数据取数据,把q1队列的数据倒q2,倒到了最后一个元素再去返回和删除元素

  //移除并返回栈顶元素
int myStackPop(MyStack* obj) {//空数据队列Queue* PEmptyQ = &obj->q1;//有数据队列Queue* PNonEmptyQ = &obj->q2;//假设空数据和有数据队列假设赋值错了if(!QueueEmpty(&obj->q1)){PEmptyQ = &obj->q2;PNonEmptyQ = &obj->q1;}//倒数据while(QueueSize(PNonEmptyQ) > 1){QueuePush(PEmptyQ,QueueFront(PNonEmptyQ));QueuePop(PNonEmptyQ);}int top = QueueFront(PNonEmptyQ);//调用了取对头数据函数QueuePop(PNonEmptyQ);//调用了删除队头数据函数return top;
}

 5.返回栈顶数据,就是返回队列的队尾数据
 //取栈顶元素
int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);//调用了取队尾的数据的函数}else{return QueueBack(&obj->q2);//调用了取队尾的数据的函数}
}

6.判创建的MyStack结构体q1和q2地址是不是空,如果是空的则标题2创建结构体失败了molloc也失败了
bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

7.程序结束销毁所有建立的空间避免内存泄漏

//释放数据
void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

http://www.lryc.cn/news/179141.html

相关文章:

  • 一朵华为云,如何做好百模千态?
  • 华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker
  • 小程序编译器性能优化之路
  • FFmpeg 命令:从入门到精通 | ffmpeg 命令分类查询
  • Linux学习记录——삼십일 socket编程---TCP套接字
  • 【学习笔记】深度学习分布式系统
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现
  • rust学习-string
  • No167.精选前端面试题,享受每天的挑战和学习
  • 【python】pycharm导入anaconda环境
  • 【数据结构】逻辑结构与物理结构
  • HTML5高级部分
  • 浏览器输入 URL 并回车发生了什么
  • asp.net core mvc 文件上传,下载,预览
  • Axios有哪些常用的方法?
  • PL/SQL+cpolar公网访问内网Oracle数据库
  • stable diffusion和gpt4-free快速运行
  • 分享三个国内可用的免费GPT-AI网站
  • 使用SDKMAN在Linux系统上安装JDK
  • MySQL(8) 优化、MySQL8、常用命令
  • 前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(三)
  • 嵌入式汇编大合集
  • C#WPF框架MvvMLight应用实例
  • 【JVM】双亲委派模型
  • 多叉树+图实现简单业务流程
  • Word | 简单可操作的快捷公式编号、右对齐和引用方法
  • leetCode 123.买卖股票的最佳时机 III 动态规划 + 状态压缩
  • JavaScript计算两个时间相差多少个小时的封装函数
  • Qt 画自定义饼图统计的例子
  • 【数据结构】链表与LinkedList