16.栈
1.栈的概念
栈(Stack)是一种数据结构,它遵循后进先出(Last-In-First-Out,LIFO)的原则,也就是说,最后进入栈的元素最先被取出。栈是一种线性数据结构,它由多个元素组成,每个元素被称为栈项(stack item),栈顶(top)是指最后一个被压入栈的元素,栈底(bottom)是指第一个被压入栈的元素。
栈的基本操作包括:
push(入栈):将一个元素压入栈顶。
pop(出栈):将栈顶的元素弹出,并返回它。
peek(查看栈顶元素):查看但不弹出栈顶元素。
isEmpty(判断栈是否为空):判断栈是否为空。
size(获取栈的大小):获取栈中元素的个数。
栈可以用于许多场景,例如函数调用、括号匹配、逆波兰表达式求值等。
2.栈的算法实现
栈数据结构的定义
#define MaxSize 128 //预先分配空间,这个数值根据实际需要预估确定
typedef int ElemType;
typedef struct _SqStack
{
ElemType* base; //栈底指针
ElemType* top; //栈顶指针
}SqStack;
栈的初始化
入栈
入栈操作:判断是否栈满,如果栈已满,则入栈失败,否则将元素放入栈顶,栈顶指针向上移动一个空间(top++)。
出栈
出栈操作: 和入栈相反,出栈前要判断是否栈空,如果栈是空的,则出栈失败,否则将栈顶元素暂存给一个变量,栈顶指针向下移动一个空间(top--)。
bool PopStack(SqStack& S, ElemType& e)//删除S的站顶元素,攒存在变量e中
{
if (S.base == S.top)//空栈
{
return false;
}
e = *(--S.top);//栈顶指针减1,将栈顶元素赋给e
return true;
}
获取栈顶元素
取栈顶元素和出栈不同,取栈顶元素只是把栈顶元素复制一份,栈的元素个数不变,而出栈是指栈顶元素取出,栈内不再包含这个元素。
//获取栈顶元素
ElemType GetTop(SqStack& S)//返回S的栈顶元素,栈顶指针不变
{
if (S.top != S.base)//栈非空
return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
else
return -1;
}
//更优的版本 可以使用自定义类型
bool GetTop1(SqStack& S, ElemType& e)//返回S的栈顶元素,栈顶指针不变
{
if (S.top != S.base)//栈非空
{
e = *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
return true;
}
else
{
return false;
}
}
判断空栈
bool IsEmpty(SqStack& S)//判断栈是否为空
{
if (S.top == S.base)
return true;
else
return false;
}
获取栈顶元素
int GetSize(SqStack& S) {//返回栈中元素个数
return (S.top - S.base);
}
销毁栈
void DestroyStack(SqStack& S)//销毁栈
{
if (S.base)
{
free(S.base);
S.base = NULL;
S.top = NULL;
}
}
完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define MaxSize 128 //预先分配空间,这个数值根据实际需要预估确定
typedef int ElemType;
typedef struct _SqStack
{
ElemType* base; //栈底指针
ElemType* top; //栈顶指针
}SqStack;
bool InitStack(SqStack& S)//构造一个空栈
{
S.base = new ElemType[MaxSize];//为顺序栈分配一个最大容量为MaxSize的空间
if (!S.base)//空间分配失败
return false;
S.top = S.base;//top初始化为base
return true;
}
bool PushStack(SqStack& S, ElemType e)//插入元素e为新的栈顶元素
{
if ((S.top - S.base) == MaxSize)//栈满
return false;
*(S.top++) = e;//元素e压入栈顶,然后栈顶指针加1,等价于*S.top = e; S.top++;
return true;
}
bool PopStack(SqStack& S, ElemType& e)//删除S的站顶元素,攒存在变量e中
{
if (S.base == S.top)//空栈
{
return false;
}
e = *(--S.top);//栈顶指针减1,将栈顶元素赋给e
return true;
}
//获取栈顶元素
ElemType GetTop(SqStack& S)//返回S的栈顶元素,栈顶指针不变
{
if (S.top != S.base)//栈非空
return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
else
return -1;
}
//更优的版本 可以使用自定义类型
bool GetTop1(SqStack& S, ElemType& e)//返回S的栈顶元素,栈顶指针不变
{
if (S.top != S.base)//栈非空
{
e = *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
return true;
}
else
{
return false;
}
}
bool IsEmpty(SqStack& S)//判断栈是否为空
{
if (S.top == S.base)
return true;
else
return false;
}
void DestroyStack(SqStack& S)//销毁栈
{
if (S.base)
{
free(S.base);
S.base = NULL;
S.top = NULL;
}
}
int GetSize(SqStack& S) {//返回栈中元素个数
return (S.top - S.base);
}
int main()
{
int n, x;
SqStack S;
InitStack(S);//初始化一个顺序栈
cout << "请输入元素个数n:" << endl;
cin >> n;
cout << "请依次输入n个元素,依次入栈:" << endl;
while (n--)
{
cin >> x; //输入元素
PushStack(S, x);
}
cout << "元素依次出栈:" << endl;
while (!IsEmpty(S))//如果栈不空,则依次出栈
{
cout << GetTop(S) << "\t";//输出栈顶元素
PopStack(S, x); //栈顶元素出栈
}
cout << endl;
DestroyStack(S);
system("pause");
return EXIT_SUCCESS;
}
参考资料来源:
奇牛学院