数据结构与算法分析之04栈和队列

来源:互联网 发布:手机淘宝客户端软件 编辑:程序博客网 时间:2024/05/01 01:24
04栈和队列
专业术语:
栈:是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义称为栈顶,相应地,表头端称为栈底。栈的修改是按后进先出的原则进行的,因此又称后进先出表。

队列:是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素,在队列中,允许插入的一端称做队尾,允许删除的一端称做队头。
栈的定义和特点:
1.定义:只能在表的一端(栈顶)进行插入和删除运算的线性表
2.逻辑结构:与线性表相同,仍为一对一关系
3.存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见
4.运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则
5.实现方式:关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。
(基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等)
队列的定义和特点:
1.定义:只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表
2.逻辑结构:与线性表相同,仍为一对一关系
3.存储结构:用顺序队列或链队存储均可
4.运算规则:先进先出(FIFO) 
5.实现方式:关键是编写入队和出队函数,具体实现依顺序队或链队的不同而不同

顺序栈的表示:
#define  MAXSIZE  100
typedef struct
{
SElemType   *base;
SElemType   *top;
int stacksize;
}SqStack;
高分笔记定义栈
typedef struct
{
int data[maxsize];
int top;
}SqStack;
顺序栈的初始化:

1.构造一个空栈
2.步骤:
(1)分配空间并检查空间是否分配失败,若失败则返回错误
(2)设置栈底和栈顶指针
    S.top = S.base;
(3)设置栈大小

顺序栈的初始化:
Status InitStack( SqStack &S )
{
S.base =new SElemType[MAXSIZE];
if( !S.base ) return OVERFLOW;
S.top = S.base;
S.stackSize = MAXSIZE;
return OK;
}

判断顺序栈是否为空:
bool StackEmpty( SqStack S )
{
if(S.top == S.base) return true;
   else return false;
}
求顺序栈长度:
 
int StackLength( SqStack S )
{
return S.top – S.base;
}
清空顺序栈:
 
Status ClearStack( SqStack S )
{
if( S.base ) S.top = S.base;
return OK;
}
销毁顺序栈:
Status DestroyStack( SqStack &S )
{
if( S.base )
{
delete S.base ;
S.stacksize = 0;
S.base = S.top = NULL;
}
  return OK;
}
顺序栈进栈:
(1)判断是否栈满,若满则出错
(2)元素e压入栈顶
(3)栈顶指针加1 
Status Push( SqStack &S, SElemType e)  
{
if( S.top - S.base== S.stacksize ) // 栈满
        return ERROR; 
*S.top++=e;
return OK;
}
简单写法:
stack[++top]=x;
顺序栈出栈:
 
(1)判断是否栈空,若空则出错
(2)获取栈顶元素e
(3)栈顶指针减1
Status Pop( SqStack &S, SElemType &e)  
{
if( S.top == S.base ) // 栈空
        return ERROR; 
e= *--S.top;
return OK;
}
简单写法:
x=stack[top--];
取顺序栈栈顶元素:
 
(1)判断是否空栈,若空则返回错误
(2)否则通过栈顶指针获取栈顶元素
Status GetTop( SqStack S, SElemType &e)  
{
if( S.top == S.base ) 
  return ERROR; // 栈空
e = *( S.top – 1 );
return OK;
}
 
 
 
优点:互相调剂,灵活性强,减少溢出机会 
共享栈
相比于普通的顺序栈,共享栈主要是为了提高内存的利用率和减少溢出的可能性而设计的,共享栈有很多的新的性质
为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的栈底分别设在这片内存空间的两端当两个栈的栈顶在某一位置的相遇时,才会产生上溢


将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长(如下图所示) 。
 

数据结构定义如下:
typedef struct
{
int top[2], bot[2];     //栈顶和栈底指针
  SElemType *V; //栈数组 
int m;          //栈最大可容纳元素个数
}DblStack;

试编写判断栈空、栈满、进栈和出栈四个算法的函数(函数定义方式如下)
void Dblpush(DblStack &s,SElemType x,int i) ;
//把x插入到栈i的栈
int Dblpop(DblStack &s,int i,SElemType &x) ;
 //退掉位于栈i栈顶的元素
int IsEmpty(DblStack s,int i) ;
//判栈i空否, 空返回1, 否则返回0
int IsFull(DblStack s) ;
//判栈满否, 满返回1, 否则返回0
栈空:top[i] == bot[i]  i表示栈的编号        
栈满:top[0]+1==top[1] 或top[1]-1==top[0] 

 

0 0
原创粉丝点击