Problem: 225. 用队列实现栈
思路
解题方法
复杂度
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;
}
};