用队列实现栈 AND 用栈实现队列

用队列实现栈

在这里插入图片描述

思路

  1. 入队列就是入栈
  2. 出队列的时候,就是把前面size-1个队列中的元素先出,这样最后一个元素就成队首元素了,再把出去的元素再次入队列
  3. 读栈顶元素,过程和第二步是一样的,就是弹出后,再把它入队列
typedef struct Node{int value;struct Node *next;
}Node;//头删+尾插typedef struct Queue{Node *front;  //链表第一个结点Node *rear;   //链表最后一个结点int size;	//数据个数
}Queue;//初始化
void QueueInit(Queue *queue){queue->front = NULL;queue->rear = NULL;queue->size = 0;
}
//销毁
void QueueDestroy(Queue *queue){Node *node, *next;for (node = queue->front; node != NULL; node = next){next = node->next;free(node);}queue->front = queue->rear = NULL;queue->size = 0;
}//Push,队尾插入,即链表的尾插
void QueuePush(Queue *queue, int val){Node *node = (Node*)malloc(sizeof(Node));node->value = val;node->next = NULL;if (queue->rear != NULL){queue->rear->next = node;queue->rear = node;}else{queue->front = queue->rear = node;}queue->size++;
}//Pop 队尾出列,即链表的头删
void QueuePop(Queue* queue){assert(queue->size > 0);queue->size--;Node *front = queue->front;queue->front = queue->front->next;free(front);if (queue->front == NULL){//处理只有一个结点的情况queue->rear = NULL;}
}
//Front 返回队首元素
int QueueFront(const Queue *queue){return queue->front->value;
}
//Rear  返回队尾元素
int QueueRear(const Queue *queue){return queue->rear->value;
}
//Empty 是否为空
int QueueEmpty(const Queue *queue){return queue->size == 0 ? 1 : 0;
}
//Size  
int QueueSize(const Queue *queue){return queue->size ;
}typedef struct{Queue queue;int maxSize;
}MyStack;/** Initialize your data structure here. */MyStack* myStackCreate() {MyStack *stack = (MyStack *)malloc(sizeof(MyStack));QueueInit(&(stack->queue));stack->maxSize = sizeof(MyStack);return stack;
}/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {QueuePush(&(obj->queue), x);
}/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {int size = QueueSize(&(obj->queue));for (int i = 0; i < size - 1; i++){int val = QueueFront(&(obj->queue));QueuePop(&(obj->queue));QueuePush(&(obj->queue), val);}int val = QueueFront(&(obj->queue));QueuePop(&(obj->queue));return val;
}/** Get the top element. */
int myStackTop(MyStack* obj) {int size = QueueSize(&(obj->queue));for (int i = 0; i < size - 1; i++){int val = QueueFront(&(obj->queue));QueuePop(&(obj->queue));QueuePush(&(obj->queue), val);}int val = QueueFront(&(obj->queue));QueuePop(&(obj->queue));QueuePush(&(obj->queue),val);return val;
}/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) {return QueueEmpty(&(obj->queue));
}void myStackFree(MyStack* obj) {QueueDestroy(&(obj->queue));free(obj);
}/*** Your MyStack struct will be instantiated and called as such:* MyStack* obj = myStackCreate();* myStackPush(obj, x);* int param_2 = myStackPop(obj);* int param_3 = myStackTop(obj);* bool param_4 = myStackEmpty(obj);* myStackFree(obj);
*/

用栈实现队列

在这里插入图片描述

思路

  1. 要用两个栈实现队列
  2. 一个为左边栈,一个为右边栈,入队列就相当于给左边栈压栈,而出队列,则是看右边栈空不空,如果为空,则将左边栈的所有元素全部依次压入右边栈,然后取右边栈顶元素,出栈(也就是出队列)
  3. 返回队首元素,过程跟第二步一样,唯一区别就是不用出栈,直接返回就行
  4. 两边栈都为空时,队列为空
class MyQueue {
public:/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {left.push(x);}/** Removes the element from in front of queue and returns that element. */int pop() {if (right.empty()){while (!left.empty()){int top = left.top();left.pop();right.push(top);}}int top = right.top();right.pop();return top;}/** Get the front element. */int peek() {if (right.empty()){while (!left.empty()){int top = left.top();left.pop();right.push(top);}}int top = right.top();return top;}/** Returns whether the queue is empty. */bool empty() {return left.empty() && right.empty();}stack<int>left;stack<int>right;
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最小栈的实现(设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。)

最小栈的实现 思路 两个栈&#xff0c;左边栈接受元素&#xff0c;右边栈存最小的元素入栈时&#xff0c;先入左边栈&#xff0c;随后进行比较&#xff0c;左边和右边栈顶元素进行比较&#xff0c;如果新元素小&#xff0c;就把新元素放在右边的栈顶位置&#xff0c;如果新元素…

再写循环队列----c++实现

再写循环队列 class MyCircularQueue { public:/** Initialize your data structure here. Set the size of the queue to be k. */MyCircularQueue(int k) {array (int *)malloc(sizeof(int)*k);capacity k;size 0;front 0;rear 0;}/** Insert an element into the circu…

再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)

树的概念 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;每个…

二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)

前序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/ int *array; int size;void _preorde…

二叉树题目----2 检查两颗树是否相同 和 对称二叉树的判定

检查两颗树是否相同 思路 根要相等 p->val q->val左子树相等 isSameTree(p->left,q->left)右子树也要相等 isSameTree(p->right,q->right) /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* …

二叉树题目---3 另一个树的子树 AND 二叉树最大深度

另一个树的子树 思路 两个数都遍历一遍&#xff0c;找到一个根结点相同时&#xff0c;判断以这个根结点为首的二叉树是否相等 前序遍历判断两棵树是否相同对于返回值的处理是难点 bool isSameTree(struct TreeNode *p, struct TreeNode *q) {if(p NULL && q NULL)…

二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数

前序遍历重构二叉树 思路 整个二叉树用数组存储因为先序遍历它先遍历根&#xff0c;再遍历左&#xff0c;左边没有跑完是不会去遍历右边的&#xff0c;所以遍历左子树&#xff0c;就是数组元素每回向后一个&#xff0c;个数-1遍历右边时&#xff0c;就是数组起始位置左子树跑到…

二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)

typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef struct Result{TreeNode * root; //构建的树的根结点int used; //构建过程中用掉的val个数 } Result;求二叉树中所有结点个数 void TreeSize(TreeNode *root, int …

c++中的智能指针详解(RAII, auto_ptr的原理及其改进,unique_ptr的原理,shared_ptr的原理,shared_ptr的缺陷及其改进)

为什么需要智能指针 代码中途退出&#xff0c;也能保证资源的合理释放&#xff0c;在c中没有垃圾回收机制的情况下&#xff0c;智能指针就可以保证我们申请的资源&#xff0c;最后忘记释放的问题&#xff0c;防止内存泄露&#xff0c;也帮我们减少了一定的负担&#xff0c;不用…

二叉树题目----5 平衡二叉树 AND 根据二叉树创建字符串

平衡二叉树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int MAX(int a,int b) {return a > b ? a : b; }//求高度 int getHeight(struct TreeNode *root){if(root NULL){…

再写堆(堆的性质,向下调整,建堆,堆的插入删除初始化,堆排序,TopK问题)

堆的概念 如果有一个关键码的集合K{k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储再一个一维数组中&#xff0c;并满足:Ki<K2i1且Ki<K2i1(Ki > K2i1 且 Ki > K2i2),i0,1,2,3…。则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆&#…

二叉树题目----6 二叉树的最近公共祖先 AND 二叉树搜索树转换成排序双向链表

二叉树的最近公共祖先 思路 在左、右子树中分别查找是否包含p或q&#xff1a;如果以下两种情况&#xff08;左子树包含p&#xff0c;右子树包含q/左子树包含q&#xff0c;右子树包含p&#xff09;&#xff0c;那么此时的根节点就是最近公共祖先如果左子树包含p和q&#xff0c;…

二叉树题目 ----7 前序中序遍历构造二叉树

前序中序遍历构造二叉树 思路 在前序中找根结点根据根结点 中序&#xff0c;分成左右两棵子树根据子树长度&#xff0c;把前序分成左右两颗子树递归处理子树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* s…

关联式容器(map,set,multimap,multiset)

关联式概念 STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这 些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。关联式容器也是用来存储数据的&#xff0c;与序列式…

详解 二叉搜索树-----AVL树

二叉搜索树 根结点比左子树中所有结点都大根结点比右子树所有结点都小最小的元素在最左侧最大的元素在最右侧中序遍历有序 具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数 二叉搜索树的操作 查找 要保存查找值的双亲&#xff0c;以便于后续执行插入操作 Node* Find(…

json格式与cJSON函数库

json的格式 键/值对 key:value&#xff0c;用半角冒号分割文档对象 JSON对象写在花括号中&#xff0c;可以包含多个键/值对。数组 JSON 数组在方括号中书写&#xff1a; 数组成员可以是对象&#xff0c;值&#xff0c;也可以是数组(只要有意义)。 { "stars":[ { &qu…

HTTP清晰的学习笔记

HTTP协议—应用层 请求消息(Request)—浏览器给服务器发 包含四部分 请求行&#xff1a;说明请求类型&#xff0c;要访问的资源&#xff0c;以及使用的http版本请求头&#xff1a;说明服务器要使用的附加信息,由键值对构成的空行&#xff1a;空行是必须要有的&#xff0c;即…

如何在 Centos7 x86_64下将vim一键配置为一款强大的C++,IDE

vim功能很强大&#xff0c;但是对于我这样的小白很不友好 然后就有一位大佬&#xff0c;为了辅助我这样的菜鸡&#xff0c;然后供我们一键搞定&#xff0c;在vim畅快编写代码的功能。 首先强烈不推荐在root用户下使用&#xff0c;确保电脑连着网。在普通用户下执行此命令 cur…

详解string容器(应用+模拟实现,string练习题)

为什么要有string容器 string&#xff1a;其实就是一个字符串,c对字符串进行了封装的&#xff0c;封装到一个类里面&#xff0c;这样用户就不用担心开辟空间的问题&#xff0c;只需要往string类里放字符串就可以了&#xff0c;string其实还可以自增长 很多人就会有一个疑问&am…

浅拷贝+引用计数--写时拷贝---模拟实现string容器

引用计数 深拷贝 多个对象共享同一份资源时&#xff0c;最后能够保证该资源只被释放一次 应该由哪个对象释放资源&#xff1f; 由最后一个使用该资源的对象去释放 怎么知道一个对象是最后一个使用该资源的对象&#xff1f; 给一个计数&#xff0c;记录使用该资源对象的个数 实…