栈是什么,生活中会用到它吗?
、
例如我们现在打开湖南工业大学官网 ➡ 资源 ➡ 数字资源,其实这就是一个入栈的过程,他们是有先后顺序的,你想再返回到官网首页就要先退出数字资源 ➡ 再退出资源,这其实就是出栈过程。
所以栈就是先进去的后出来。
一、 栈的定义
typedef struct{
int data[MAXSIZE];//int 型数组
int top;//用于栈顶指针,就是计数,确定现在谁在最外面,一会儿好让他出去
}SqStack;
栈是顺序存储
二、 栈空或者满怎么判断
现有一int p(增加一个数据p就++),和一个数组a[],那么怎么用这个灵活的P判断这个数组是否为空?
肯定不能说p对应a[0]的时候他为空,因为这说明里面还存放着数据a[0],所以我们可以设定在p=-1的时候判定数组为空。(当然你自己写全部代码的时候,你想规定p=0的时候为空,p=数组长度的时候为满也可以,只是通常不这么默认)
那么又怎么判断数组是否满呢?
最简单的就是当p = 数组长度-1时,就代表这个数组满了。
所以通常规定,栈顶指针top = -1 时,判定栈为空;top = MAXSIZE - 1时栈满。
三、进栈、出栈
3.1 进栈
void push(SqStack *s,int a){
if ( top >= MAXSIZE){
{
cout<<"栈满,无法操作"<<endl;
return ;
}
s->top++;
s->data[s->top] = a ;
return;
}
3.2 出栈
void Pop(SqStack* s){
if( s-> top < 0)
{
cout<<"操作失败,栈为空"<<endl;
return;
}
s->top--;
}
四、栈的链式储存
栈的链式储存结构,简称为链栈。
4.1 链栈构造
typedef struct StackNode{//创建结点,和链表一样
int data;
struct StackNode* next;
}SN,* pSN;
typedef struct LinkStack{//创建栈
pSN top;//头指针,记录头结点
int count;//记录结点数,
//之前在栈中是直接通过在定义数组时MAXSIZE记录最大容量,
//但链表没有限定的最大容量,除非内存已满,
//所以通过count记录结点数
}LS;
4.2 链栈进栈
注意链栈在进栈时,头指针每次都要发生变化.以下为核心代码
pSN s = (pSN)malloc(sizeof(SN));
//创建一个新结点
s -> data = e;
//新结点的值为e
s -> next = S-> top;
//新节点连接的下一结点是原来结点的头结点
S -> top = s;
//原来结点的头结点现在变成了这个新的结点s
//(别迷糊,不论是S,还是s,都是指针,所以赋值操作就是给首地址
S -> count ++ ;
//链栈的结点增加1
4.3 链栈出栈
pSN p;//创建临时结点,为后面释放这片地址
if(StackEmpty(*S)) return ;
p = S -> top;//p 现在保存着原来头结点的地址
S -> top = S -> top -> next;
//现在的头结点是原来头结点的下一结点
free(p);
//释放原来头结点的空间
S -> count -- ;
//链栈结点减少1