概要:本期学习栈的结构以及操作实现。
一、栈的结构
栈是一种常用的数据结构,具有显著的特点:
1.只允许在一侧进行入栈、出栈操作。
2.先入栈的元素后出栈。
具体结构如下图所示:
二、栈的操作实现
下面是利用了单链表来实现的栈的入栈出栈操作。
0.栈的结构和初始化
class DoubleLinkedListStack
{
private:
class Element
{
public:
QString data;
Element *next;//指向上一个元素
};
int length;
Element *top;//栈顶
public:
DoubleLinkedListStack();
}:
DoubleLinkedListStack::DoubleLinkedListStack()
{
//初始化空栈,栈顶元素指向空
top = new Element;
top->data = "";
top->next = nullptr;
length = 0;
}
1.入栈
void DoubleLinkedListStack::Push(QString data)
{
Element *_elem = new Element;
_elem->data = data;
if(top->next == nullptr)
{
top->next = _elem;
_elem->next = nullptr;
}
else
{
_elem->next = top->next;
top->next = _elem;
}
length++;
qDebug()<<data<<QStringLiteral("入栈成功!")<<endl;
qDebug()<<QStringLiteral("当前栈大小为:")<<length<<endl;
}
2.出栈
void DoubleLinkedListStack::pop()
{
if(length <=0)
{
qDebug()<<QStringLiteral("栈为空,出栈失败!")<<endl;
return;
}
Element *_elem = top;
top = _elem->next;
delete _elem;
_elem = NULL;
length--;
qDebug()<<QStringLiteral("出栈成功!")<<endl;
}
3.打印栈中元素
void DoubleLinkedListStack::DisplayStack()
{
Element *_elem = top->next;
int i = 0;
qDebug()<<QStringLiteral("栈大小为:")<<length<<endl<<QStringLiteral("栈中元素如下:");
while(i < length)
{
qDebug()<<_elem->data<<" "<<endl;
_elem = _elem->next;
i++;
if(_elem == NULL)
{
return;
}
}
}
结尾
本期对于栈的学习就到这,下期我们学习队列:)