堆栈数据结构
在本文中,我们将了解堆栈数据结构的工作原理和需求。
在编程时,我们经常处理大量不均匀的原始数据。
这就需要数据结构来存储数据并使用户能够有效地对数据进行操作。
堆栈数据结构入门
堆栈是一种线性数据结构,遵循特定的顺序进行数据的插入和操作。
Stack使用"先进先出(LIFO)"方法输入和输出数据。
堆栈以预定义的顺序(即LIFO)其中占据特定数据类型的元素。
叠放
如上图所示,堆栈中的最后一个元素是第一个从堆栈中弹出的元素。
数据项的插入和删除从堆栈的同一端进行。
让我们尝试将堆栈与现实场景联系起来。
考虑一堆书。
如果您观察的话,最后放置的书将是我们所阅读的第一本书。
而且,一本新书只能放在书堆的顶部。
因此,描述了堆栈的工作。
堆栈上执行的操作
堆栈数据结构主要处理对数据的以下操作:
push():此函数将数据元素添加到堆栈中。pop():它从堆栈中删除顶部元素。
top():返回最上面的元素,即堆栈顶部的元素。isEmpty():检查堆栈是否为空,即下溢情况。
isFull():检查堆栈是否已满,即溢出条件。
堆栈数据结构的工作
堆栈数据结构遵循LIFO模式,用于其中插入和操作元素。
注意:我们设置了一个名为" top"的指针元素,以保留堆栈中最顶层的元素。
这将有助于以有效的方式执行插入和删除操作。
PUSH(插入)操作:
最初,它检查堆栈是否已满,即检查溢出条件。
如果发现堆栈已满,它将退出并显示一条溢出消息。
如果发现堆栈中有可容纳元素的空间,则将顶部计数器加1,然后将数据项添加到堆栈中。
POP(删除)操作:
最初,它检查堆栈是否为空,即检查下溢情况。
如果发现堆栈为空,它将与一条下溢消息一起存在。
如果堆栈不为空,则显示顶部指针元素所指向的元素,然后将顶部指针减1。
堆栈数据结构的实现
可以使用以下两种方式之一来实现堆栈:
- 链表
- 数组
我们已经写了一篇有关C++中Stack的综合文章。
在演示中,我将使用C++语言的Array创建一个简单的堆栈实现。
例:
# include<iostream>
using namespace std;
class stack_data
{
public:
int top;
int data[5];
stack_data()
{
top = -1;
}
void push_element(int a);
int pop_element();
void isEmpty();
void isFull();
void display();
};
void stack_data::push_element(int a)
{
if(top >= 5)
{
cout << "Overflow\n";
}
else
{
data[++top] = a;
}
}
int stack_data::pop_element()
{
if(top < 0)
{
cout << "Underflow\n";
return 0;
}
else
{
int pop = data[top--];
return pop;
}
}
void stack_data::isEmpty()
{
if(top < 0)
{
cout << "Stack Underflow\n";
}
else
{
cout << "Stack can occupy elements.\n";
}
}
void stack_data::isFull()
{
if(top >= 5)
{
cout << "Overflow\n";
}
else
{
cout << "Stack is not full.\n";
}
}
void stack_data::display()
{
for(int i=0;i<5;i++)
{
cout<<data[i]<<endl;
}
}
int main() {
stack_data obj;
obj.isFull();
obj.push_element(40);
obj.push_element(99);
obj.push_element(66);
obj.push_element(40);
obj.push_element(11);
cout<<"Stack after insertion of elements:\n";
obj.display();
cout<<"Element popped from the stack:\n";
cout<<obj.pop_element()<<endl;
}
输出:
Stack is not full. Stack after insertion of elements: 40 99 66 40 11 Element popped from the stack: 11
堆栈功能
堆栈遵循"后进先出"的方式来处理元素的插入和删除。
数据项的插入和删除仅从"单端"发生。
本质上,栈被认为是"动态的",即它是"动态的数据结构"。
堆栈不占用数据项的"固定大小"。
堆栈的大小会随着每次
push()和pop()操作而不断变化。
堆栈的应用
在编程中,堆栈可用于反转数组或者字符串的元素。
在需要回溯的情况下(例如N皇后问题等),堆栈可能很有用。
在编辑器中,Stack可以高效地执行撤消和重做功能。
二叉树的前缀/前缀/后缀转换。
堆栈操作的时间复杂度
- 推送操作,即push():O(1)
- 弹出操作,即pop():O(1)
push()和pop()操作的时间复杂度保持为O(1),因为数据项的插入和删除仅发生在堆栈的一端,这是要执行的单步处理。

