上一篇文章http://blog.youkuaiyun.com/hongkangwl/article/details/22286469中用C++实现了双向链表了,下面我们对其封装,得到栈~~
、
我们用链表的插入和删除模仿pop和push
完整代码如下:
#include <iostream>
using namespace std;
struct node
{
int date;
node* prev;
node* next;
};
class doublelink
{
public:
int doublelink_insert(doublelink* ptr,int position,int member);
int doublelink_erase(doublelink* ptr, int position);
void doublelink_display(doublelink* ptr, int num);
int doublelink_getlength(doublelink* ptr);
doublelink()
{
root = new node;
root->prev = NULL;
root->next = NULL;
length = 0;
}
protected:
private:
int length;
node* root;
};
int doublelink::doublelink_erase(doublelink* ptr, int position)
{
if (ptr->doublelink_getlength(ptr) == 0)
{
cout<<"链表为空,oop!!"<<endl;
return 0;
}
else
{
if (ptr->doublelink_getlength(ptr) == 1)
{
ptr->root->next = NULL;
ptr->length--;
}
else
{
node* deletenode = root->next;
for (int i = 0 ; i < position; i++)
{
deletenode = deletenode->next;
}
deletenode->prev->next = deletenode->next;
deletenode->next->prev = deletenode->prev;
delete deletenode;
ptr->length--;
}
}
}
void doublelink::doublelink_display(doublelink* ptr, int num)
{
node* current = root->next;
for (int i = 0; i < num; i++)
{
cout<<current->date<<" ";
current = current->next;
}
cout<<endl;
}
int doublelink::doublelink_getlength(doublelink* ptr)
{
return ptr->length;
}
int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
node* nodeinsert = new node;
nodeinsert->date = member;
if (ptr->doublelink_getlength(ptr) == 0)
{
root->next = nodeinsert;
nodeinsert->prev = nodeinsert;
nodeinsert->next = nodeinsert;
ptr->length++;
return 0;
}
else
{
if (position == 0)
{
/* root->next->prev = nodeinsert;
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev = nodeinsert;*/
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev->next = nodeinsert;
root->next->prev = nodeinsert;
root->next = nodeinsert;
ptr->length++;
return 0;
}
else
{
node* current = root->next;
for (int i = 0; i < position; i++)
{
current = current->next;
}
nodeinsert->next = current;
nodeinsert->prev = current->prev;
current->prev->next = nodeinsert;
//nodeinsert->next = nodeinsert;
current->prev = nodeinsert;
ptr->length++;
return 0;
}
}
}
class stack
{
public:
void pop();
void push(int num);
void stack_display();
stack()
{
double_ptr = new doublelink;//双链表的对象
}
protected:
private:
doublelink* double_ptr;
};
void stack::stack_display()
{
double_ptr->doublelink_display(double_ptr,double_ptr->doublelink_getlength(double_ptr));
}
//底层实现是用双链表的插入
void stack::push(int num)
{
double_ptr->doublelink_insert(double_ptr,double_ptr->doublelink_getlength(double_ptr),num);
}
//底层实现是双链表的删除
void stack::pop()
{
double_ptr->doublelink_erase(double_ptr,double_ptr->doublelink_getlength(double_ptr) - 1);
}
int main()
{
stack Stack;
for (int i = 0; i < 10; i++)
{
Stack.push(i);
}
Stack.stack_display();
Stack.pop();
Stack.pop();
Stack.stack_display();
return 0;
}