1
使用栈实现队列
#include <iostream>
#include <stack>
class MyQueue
{
public:MyQueue() {}void push(int x){in.push(x); // 直接将元素push入in栈}int pop(){int data = peek(); // 先查一遍,就是更新一遍out栈out.pop();return data;}// 查找队列头的元素int peek(){// 首先检查out栈是否为空,如果为空,则将in栈的元素出栈然后入栈outif (out.empty())// 这里刚开始写成当in为空时执行循环了,就会出错while (!in.empty()) // 必须全部将in栈的数据搬到out栈,不然会导致数据混乱{out.push(in.top());in.pop();}return out.top();}bool empty(){return in.empty() && out.empty();}private:std::stack<int> in;std::stack<int> out;
};int main()
{MyQueue que;que.push(1);que.push(2);que.push(3);que.push(4);que.push(2);std::cout << que.pop() << std::endl;std::cout << que.pop() << std::endl;std::cout << que.pop() << std::endl;std::cout << que.pop() << std::endl;std::cout << que.pop() << std::endl;return 0;
}
2
输入一个数组,找到任意一个峰值元素返回其位置,时间复杂度为O(logN)。
#include <iostream>
#include <vector>
/* 输入一个数组,找到任意一个峰值元素(大于其最近左边和右边的元素),返回其位置,时间复杂度是O(logN) */int peak_Index(std::vector<int> &data)
{int left = 0;int right = data.size() - 1;while (left < right){int mid = left + (right - left) / 2;if (data[mid] > data[mid + 1]) // 比右边的数大,那就在mid左边right = mid; // mid有可能是峰值元素else // 比右边数小,那就在mid右边left = mid + 1; // mid不可能是峰值元素}return left;
}int main()
{std::vector<int> data = {1, 2, 3, 1};std::cout << peak_Index(data) << std::endl;return 0;
}