栈
栈是一种重要的线性数据结构,其核心特点是后进先出(LIFO,Last In First Out),即最后加入的元素最先被取出。以下是关于栈的基础知识总结:
一、核心特性
- 操作受限:只能在栈的一端(称为 “栈顶”)进行插入和删除操作
- 栈底固定:另一端称为 “栈底”,不直接参与操作
- 顺序性:元素按照入栈顺序依次排列,遵循 LIFO 原则
二、基本操作
InitStack(&S):初始化栈。构造一个空栈 S,分配内存空间。
DestroyStack(&S):销毁栈。销毁并释放栈 S 所占用的内存空间。
Push(&S, x):进栈。若栈 S 未满,则将 x 加入使其成为新的栈顶元素。
Pop(&S, &x):出栈。若栈 S 非空,则弹出(删除)栈顶元素,并用 x 返回。
GetTop(S, &x):读取栈顶元素。若栈 S 非空,则用 x 返回栈顶元素。
StackEmpty(S):判空。断一个栈 S 是否为空,若 S 为空,则返回 true,否则返回 false
三、实现方式
1. 数组实现
- 使用固定大小的数组存储元素
- 用一个指针(栈顶指针)标记当前栈顶位置
- 优点:访问速度快;缺点:大小固定,可能溢出
2. 链表实现
- 用链表的头节点作为栈顶
- 入栈相当于在表头插入节点,出栈相当于删除表头节点
- 优点:大小动态调整;缺点:相比数组多了指针开销
静态数组实现栈
- 进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。
S.data[++S.top] = x
- 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1。x = S.data[S.top--]
- 栈空条件:S.top==-
- 栈满条件:S.top==MaxSize-1
- 栈长:S.top+1
这里的top记录的是现在的栈定元素,如果要push,那么top应该加加;
#include <iostream>
using namespace std;
#define Maxsize 10
typedef struct
{
int data[Maxsize];
int top;///top指向现在栈顶的元素
}SqStack;
void InitStack(SqStack &s)
{
s.top=-1;
}
bool StackEmpty(SqStack &s)
{
if(s.top==-1)return true;
else return false;
}
bool Push(SqStack &s,int data)
{
if(s.top==Maxsize-1)return false;
s.top++;
s.data[s.top]=data;
return true;
}
bool GetTop(SqStack &s,int &x)
{
if(s.top==-1)return false;
x=s.data[s.top];
return true;
}
int main()
{
cout << "Hello World"<<endl;
SqStack s;
InitStack(s);
cout<<s.top<<endl;
bool exsit=StackEmpty(s);
cout<<"empty or not "<<exsit<<endl;
Push(s,3);
Push(s,4);
Push(s,5);
cout<<"empty or not "<<StackEmpty(s)<<endl;
cout<<s.top<<endl;
cout<<GetTop<<endl;
int size=s.top;
while(s.top!=-1)
{
cout<<s.data[s.top]<<' ';
s.top--;
}
cout<<endl;
s.top=size;
int x;
GetTop(s,x);
cout<<x<<endl;
return 0;
}