栈的顺序存储结构及其基本运算的实现(第三章:栈和队列)

栈的定义: 栈是一种只能在一端进行插入或删除操作的线性表。

原则: 后进先出。

小女孩想要数字为“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是从左向右读,出栈序列是 从右向左读,两者相等说明该串是对称串。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44630560/article/details/107908556