【数据结构入门训练DAY-19】总结数据结构中的栈
文章目录
- 前言
- 一、栈的思想
- 二、栈的解题思路
- 结语
前言
本次训练内容:
- 栈的复习。
- 总结栈的基本操作
一、栈的思想
在数据结构中,栈是一种很常见的算法。栈——就像你往桶里放东西似的,要取出桶内的物体就得先把桶顶的物品取出来,再依次取到桶底,所以它遵循的原则是“先进后出”;而后栈的使用也非常广泛,例如在函数调用中用于保存局部变量、在表达式求值中用于保存操作数等。
二、栈的解题思路
栈的操作有:创建新的栈,栈的入栈操作,栈的出栈操作,判断栈空等。下面我将一一分享我对栈操作的“公式”。
我喜欢先建立一个栈的结构体。例如下面的代码:
typedef long long SElemType;
typedef struct SqStack {//创建栈的结构体SElemType e;struct SqStack *next;
} SqStack;
建立栈的结构体后,我就开始创建空的新栈。例如下面的代码:
void InitStack(SqStack* &S) {//创建空栈S = nullptr;
}
创建好空栈后意味着我们可以对它进行添加和删除操作了。首先我先写入栈操作;栈未满时,则可以插入元素,将栈顶指针上移,并再将需要插入的元素赋值给栈顶。例如下面的代码:
bool Push(SqStack &S, SElemType e) {//入栈操作S.next++;S.data[S.next] = e;return true;
}
写完入栈操作接着的就是出栈操作。它的思想就是,先判断非空,栈在非空的情况下,栈顶指针依次下移,栈内元素不断被弹出,直到栈空。例如下面的代码:
bool Pop(SqStack* &S, SElemType &e) {//出栈操作if (S == nullptr) {return false;}SqStack* temp = S;e = temp->e;S = S->next;delete temp;return true;
}
紧接的我们跟上判断栈空的操作。它的操作书写就更简单,只需要判断栈是否等于null即可。例如下面的代码:
bool SqStackEmpty(SqStack* S) {//判断是否为空栈return S == nullptr;
}
然后还有一个就是判断栈顶元素的。它的思想就是让栈指针保持指向栈顶即可。
int Top(SqStack* &S )
{int t; //为判断是否为栈顶元素做准备 if (s.top == -1) return -1; //栈空t= s.data[s.top]; //栈非空,不断更新指针位置return t; //返回栈顶的值
}
结语
今晚算是对这段时间写栈的题目进行的一次总结。在复习使用栈的操作时,我也经常使用STL里的类似逻辑进行拓展学习。STL的使用效率往往比原理快,但是原理是对栈概念的理解和支撑。所以我在使用高效率的代码时,就也会把原理逻辑补充上去,方便往后复习能更好的理解。