栈:具有先进后出的特点,且只能在一端进行插入与删除的操作,栈的实现如下所示


struct truetype

{

bool get()

{

return true;

}

};

struct falsetype

{

bool get()

{

return false;

}

};

template<class T>

struct typetraits

{

typedef falsetype isnpodtype;

};

template <>

struct typetraits<int>

{

typedef truetype ispodtype;

};


template<class T>

class stack

{

protected:

T *_a;

size_t _top;

size_t _capacity;

public:

stack()

: _top(0)

, _capacity(3)

{

_a = new T[_capacity];

}

~stack()

{

if (_a)

delete[] _a;

}

void checkcapacity()

{

if (_top == _capacity)

{

_capacity = 2 * _capacity;

T *tem = new T[_capacity];

if ((typetraits<T>::ispodtype()).get())

{

memcpy(tem, _a, sizeof(T)*_capacity);

delete[]_a;

_a = tem;

}

else

{

int i = 0;

for (i = 0; i < _top; i++)

{

tem[i] = _a[i];


}

delete[]_a;

_a = tem;

}

}

}

void push(const T&x)

{

checkcapacity();

_a[_top] = x;

_top++;

}

void pop()

{

_top--;

}

bool Empty()

{

return _top == 0;


}

T &Top()

{

if (_top > 0)


{

size_t ret = _top;

_top--;

return _a[ret - 1];

}

}


};

int main()

{

stack<int> s1;

s1.push(1);

s1.push(2);

s1.push(3);

s1.push(4);

while (!s1.Empty())

{

cout << s1.Top() << " ";

}

getchar();

return 0;

}

2.队列:具有队头插入,队尾删除的特点,具有一个头指针和一个尾指针

template <class T>

struct Node

{

T _data;

Node <T> *_next;

Node(const T &data=0)

{

_data = data;

_next = NULL;

}

};

template <class T>

class Queue

{

protected:

Node<T> *_head;

Node <T>*_tail;

public:

Queue()

:_head(NULL)

, _tail(NULL)

{}

~Queue()

{

Node<T> *ret = NULL;

if (_head == NULL)

return;

if (_head == _tail)

{

delete _head;

_head = NULL;

_tail = _head;

}

else

{

while (_head)

{

pop();

}

}

}

void push(const T&x)

{

Node<T> *newNode = new Node<T>(x);

if (_tail == NULL)

{

_tail = newNode;

_head = _tail;

}

else

{

_tail->_next = newNode;

_tail = newNode;

}

}

void pop()

{

Node<T>*ret = NULL;


if (_head == NULL)

return;

if (_head == _tail)

{

delete _head;

_head = NULL;

_tail = _head;

}

else

{

ret = _head;

_head = _head->_next;

delete ret;

}

}

T &Front()

{

Node <T>*ret = _head;

_head = _head->_next;

return ret->_data;

}

T &Back()

{

Node <T>*ret = _tail;

_tail = _head->_tail;

return _tail->_data;

}

bool Empty()

{

return _head == _tail;

}

void show()

{

while (_head)

{

cout << _head->_data << " ";

_head = _head->_next;

}

}

};

int main()

{

Queue<int> q;

q.push(1);

q.push(2);

q.push(3);

q.push(4);

q.pop();

q.show();

getchar();

return 0;

}