栈的定义: 栈是一种只能在一端进行插入或删除操作的线性表。
原则: 后进先出。
小女孩想要数字为“2”的小球,男孩只能先把数字为“3”和“1”的小球拿出来,才能拿到小女孩想要的小球。
栈的特有操作:
-
表中允许进行插入、删除操作的一端称为栈顶。
栈顶的当前位置是动态的
栈顶的当前位置由一个称为栈顶指针的位置指示器指示。 -
表的另一端称为栈底。
-
栈的操作 栈顶
插入操作:通常称为进栈或入栈
删除操作:通常称为退栈或出栈。 -
当栈中没有数据元素时,称为空栈。
顺序栈4要素: 以MaxSize=5的栈为例
- 栈空条件: top=-1
- 栈满条件: top=MaxSize-1
- 进栈e操作:top++; 将e放在top处
- 退栈操作: 从top处取出元素e; top–;
初始化栈initStack(&s)
- 建立一个新的空栈s,实际上是将栈顶指针指向-1即可
void InitStack( SqStack *&s )
{
s = (SqStack *)malloc(sizeof(SqStack)); s->top = -1;
}
销毁栈ClearStack(&s)
- 释放栈s占用的存储空间
void DestroyStack(SqStack *&s)
{
free(s);
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200818133227768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDYzMDU2MA==,size_16,color_FFFFFF,t_70#pic_center)
判断栈是否为空StackEmpty(s)
- 要点:栈S为空的条件是s->top==-1
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
进栈Push(&s,e)
-
条件:在栈不满时,可以进栈
-
操作
-* 将栈指针增1
-*在该位置上插入元素e
bool Push(SqStack *&s,ElemType e)
{
if (s->top==MaxSize-1) return false;
s->top++;
s->data[s->top]=e; return true;
}
出栈Pop(&s,&e)
-
条件:栈不为空时
-
操作
-*将栈顶元素赋给e
-*将栈指针减1
bool Pop(SqStack *&s,ElemType &e)
{
if (s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
取栈顶元素GetTop(s,e)
- 条件:栈不为空时
- 操作:将栈顶元素赋给e
bool GetTop(SqStack *s,ElemType &e)
{
if (s->top==-1)
return false;
e=s->data[s->top];
return true;
}
用栈的思维解决问题
问题
编写一个算法利用顺序栈判断一个字符串str是否是 对称串
对称串:从左向右读和从右向左读的序列相同
解法1
顺序表存储
从两边“夹逼”,直到得出结论
解法2
顺序栈存储
先将str所有元素进栈,出栈的将是逆序的字符串
从头开始扫描str,并出栈元素,将两者进行比较
实质:从头开始扫描str是从左向右读,出栈序列是 从右向左读,两者相等说明该串是对称串。