链表和队列复习

来源:互联网 发布:deepin linux 15.4.1 编辑:程序博客网 时间:2024/05/29 19:49

顺序栈——栈的顺序存储结构
栈的顺序存储结构简称为顺序栈。即用一组地址连续的存储单元依次存储自栈底到栈顶的元素。可用数组来实现顺序栈,附设top指针指示栈顶元素在顺序栈中的位置。

#define STACK_INIT_SIZE 100;//初始分配量
#define STACKINCREMENT 10;  //分配增量
     typedef struct {
       SElemType   *base;  //栈底
       SElemType   *top;   //栈顶
       int   stacksize; //当前可用最大容量,以元素为单位
    }SqStack;
可用数组来实现顺序栈。
因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而变化的,故需用一个整型变量top
入栈:top++
出栈:top--
栈空:top==base

基本操作:
          InitStack(&S)  构造一个空栈S
          GetTop(S,&e)   用e返回栈顶元素
          Push(&S,e)     插入元素e为新的栈顶元素(入栈)
          Pop(&S,e)      删除栈顶元素,用e返回(出栈)
链式栈——栈的链式存储结构
插入和删除操作仅限制在表头位置上进行。
由于只能在链表头部进行操作,故链表没有必要像单链表那样附加头结点。栈顶指针就是链表的头指针。
typedef  struct  StackNode{
            datatype  data
            struct StackDode *next
          }StackNode;

链式存储结构定义
typedef struct {
SLink top;    // 栈顶指针
int length;   // 栈中元素个数
} Stack;

 p -> data = e; 
p -> next = S.top; 
// 链接到原来的栈顶 
S.top = p;   

退栈e = S.top -> data;   // 返回栈顶元素   
q = S.top;   
 S.top = S.top -> next; // 修改栈顶指针  
  --S.length;       // 栈的长度减1

栈运用:迷宫算法思想:若当前位置“可通”,则纳入路径,继续前进;若当前位置“不可通”,则后退,换方向继续探索;若四周“均无通路”,则将当前位置从路径中删除出去。

设定当前位置的初值为入口位置;
 do{
   若当前位置可通,
   则{将当前位置插入栈顶;
           若该位置是出口位置,则算法结束;           
           否则切换当前位置的东邻方块为
                   新的当前位置;
   }
   否则 {
   }
}while (栈不空);

若栈不空且栈顶位置尚有其他方向未被探索,
则设定新的当前位置为: 沿顺时针方向旋转
            找到的栈顶位置的下一相邻块;

若栈不空但栈顶位置的四周均不可通,
则{删去栈顶位置;// 从路径中删去该通道块                  
        若栈不空,则重新测试新的栈顶位置,
        直至找到一个可通的相邻块或出栈至栈空;
若栈空,则表明迷宫没有通路。

链队列:用链表表示的队列简称为链队列。
  实质上就是限定在表头做删除操作,在表尾做插入操作的单链表。所有的操作都在两端进行。
两个指针:
队头指针Q.front指向头结点
队尾指针Q.rear指向尾结点
队列的链式存储结构
   typedef  struct QNode { //元素结点
      QElemType  data;
      struct QNode *next;
   }QNode, *QueuePtr;

   typedef struct{            //特殊结点   
      QueuePtr  front;    //队头指针
      QueuePtr  rear;        //队尾指针
  }LinkQueue;

循环队列:克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为循环队列。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(MAXSIZE-1)时,其加1操作的结果是指向向量的下界0。

typedef struct {
  QElemType  *base;  // 动态分配存储空间
  int  front;        // 头指针,若队列不空,指向队列
                     //头元素
  int  rear;         // 尾指针,若队列不空,指向队列
                     //尾元素的下一个位置
 } SqQueue;
不能用动态分配的一维数组来实现循环队列,初始化时必须设定一个最大队列长度。
初始化 Status InitQueue (SqQueue &Q)
   Q.front=Q.rear=0;
求队列的长度 int QueueLength(SqQueue Q)   
   return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
入队 Status EnQueue (SqQueue &Q, QElemType e)
   if ((Q.rear+1) % MAXQSIZE ==Q.front) return ERROR; //队满
   Q.rear = (Q.rear+1)%MAXQSIZE;
出队 Status GetHead(SqQueue Q,QElemType &e)
if (Q.front==Q.rear) return ERROR;//队空
Q.front = (Q.front+1) % MAXQSIZE;

 

原创粉丝点击