单一队列表示成栈的方法

本文详细解释了如何利用队列实现栈的数据结构,通过调整队列元素顺序来保持栈的后进先出特性。入栈、出栈和获取栈顶操作的时间复杂度分析,以及空间复杂度的讨论也包含在内。
摘要由CSDN通过智能技术生成

Problem: 225. 用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

思路
解题方法
复杂度
Code
思路
讲述看到这一题的思路
这题可以根据栈和队列的性质去解决;一个是后进先出,一个是先进先出,
我们可以将队列中刚刚入队的元素放入队列尾端,放几次取决于它前面的元素个数是多少,如要实现abcd的栈,a为栈底,d为栈顶,依次插如a,待插入b是队列顺序是ab;
可以将a放入队列的末端这就满足b比a先出的顺序,再插入c可以将ba依次按顺序放入队列尾端,最后其顺序为cba,依次类推,可以得出dbca的队列满足abcd的栈

解题方法
描述你的解题方法
使用一个队列时,为了满足栈的特性,即最后入栈的元素最先出栈,同样需要满足队列前端的元素是最后入栈的元素。

入栈操作时,首先获得入栈前的元素个数 n,然后将元素入队到队列,再将队列中的前 n 个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。

由于每次入栈操作都确保队列的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除队列的前端元素并返回即可,获得栈顶元素操作只需要获得队列的前端元素并返回即可(不移除元素)。

由于队列用于存储栈内的元素,判断栈是否为空时,只需要判断队列Bold是否为空即可。

复杂度
时间复杂度:

添加时间复杂度, 示例: O(n)
入栈操作为O(n),其余操作都是 O(1),其中 n 是栈内的元素个数。
入栈操作需要将队列中的 n 个元素出队,并入队 n+1 个元素到队列,共有 2n+1次操作,每次出队和入队操作的时间复杂度都是 O(1),因此入栈操作的时间复杂度是 O(n)。
出栈操作对应将队列的前端元素出队,时间复杂度是 O(1)。
获得栈顶元素操作对应获得队列的前端元素,时间复杂度是 O(1)。
判断栈是否为空操作只需要判断队列是否为空,时间复杂度是 O(1)

空间复杂度:
复杂度为O(n);其中n是栈内的元素个数,需要使用一个队列存储栈内的元素;

Code

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
     void order(TreeNode* head,vector<int>&a){
       if(head==nullptr){
        return;
       }
       order(head->left,a);
       order(head->right,a);
       a.push_back(head->val);
     }   
        
    vector<int> postorderTraversal(TreeNode* root) {
         vector<int>a;
         order(root,a);
         return a;
    }
};


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值