栈这种数据结构我们应该挺熟了,先入后出,只有一个出口(出口靠栈顶近)嘛
void test()
{
stack s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
cout << s.size() << endl;
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
队列想必也不必我过多介绍,就是排队嘛,先进先出
void test1()
{
queue q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
cout << q.size() << endl;
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
在聊适配器概念之前然我们看看库里面是怎么描述stack和queue的
栈
不想看英文可以看这
队列
不想看英文可以看这
标准家庭用电电压为220V,我们设备用电其实并不需要这么高,电源适配器是要让家庭用电的电压降低到适合设备使用的电压
站在这个角度理解的话那么,适配器应该是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。
我这实现的是数组栈
namespace xxx
{
template>
class stack
{
public:
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_back();
}
T& top()
{
return _c.back();
}
const T& top()const
{
return _c.back();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
}
测试一下
#include
#include
#include
using namespace std;
#include"stack.h"
void test()
{
xxx::stack> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
cout << s.size() << endl;
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
int main()
{
test();
return 0;
}
就是调用其他类的接口,没什么难度我就直接上代码了
namespace xxx
{
template>
class queue
{
public:
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_front();
}
T& back()
{
return _c.back();
}
const T& back()const
{
return _c.back();
}
T& front()
{
return _c.front();
}
const T& front()const
{
return _c.front();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
}
测一下
void test1()
{
xxx::queue> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
cout << q.size() << endl;
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
我们可以看到上面stack和queue都用deque作为默认的接口,那么deque有什么好呢?
void test2()
{
priority_queue pq;
pq.push(1);
pq.push(2);
pq.push(3);
pq.push(4);
pq.push(5);
pq.push(6);
while (!pq.empty())
{
cout << pq.top() << " ";
pq.pop();
}
cout << endl;
}
template >
class priority_queue
{
public:
void adjust_up(int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (c[child] > c[parent])
{
swap(c[child], c[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
void adjust_down(int parent)
{
int child = parent * 2 + 1;
while (child < c.size())
{
if (child + 1 < c.size() && c[child + 1] > c[child])
{
++child;
}
if (c[child] > c[parent])
{
swap(c[child], c[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
bool empty() const
{
return c.empty();
}
size_t size() const
{
return c.size();
}
const T& top() const
{
return c[0];
}
void push(const T& x)
{
c.push_back(x);
adjust_up(c.size()-1);
}
void pop()
{
swap(c[0], c[c.size() - 1]);
c.pop_back();
adjust_down(0);
}
private:
Container c;
};