栈和队列


关于栈和队列是两种特殊的线性表

一.栈:是一种先进后出的线性表。

1.以下是顺序表表示的方法及相关的定义:

具体的结构如下:

typedef struct {

       ElemType *base;

       ElemType *top;

       int stacksize;

       }Sqstack;


构造一个空栈

 

int initstack(Sqstack &L){

       L.base = (ElemType*)malloc(INIT_SIZE*sizeof(ElemType));

       if(!L.base)exit(OVERFLOW);

       L.top = L.base;

       L.stacksize = INIT_SIZE;

 return OK;

       }

其它操作如push,pop,traverse等操作均为一些简单的操作,在此就不再贴出相关代码

 

2.以下是链式表示的方法及相关的定义:

       具体结构如下:

typedef structnode {

              ElemType data;

struct node*next;

       }stacknode;

构造一个空栈此时就是一个逆序建立一个链表的过程其中栈底不带元素由此可以看出就是一种链表所以回归到栈就是一种线性表的主题了

intcreatestack(stacknode &L){

       L =(stacknode*)malloc(sizeof(stacknode));

       L->next = null;

for(i=n;i>0;i--){

       p =(stacknode*)malloc(sizeof(stacknode));

       scanf(“%d”,p->data);

       p->next = L->next;

       L->next = p;

           }
}


二.队列:是种后进后出的线性表

第一种表示方法类似于链表

typedef struct QNode {
      QElemType data; 
      struct QNode *next;
}QNode, *QueuePtr;

typedef struct {
     QueuePtr front;        //队头指针
     QueuePtr rear;         //队尾指针
}LinkQueue;


第二种表示方法

顺序存储结构的类型定义

#define MAXQSIZE 100

typedefstruct{

       QElemType*base;      //初始化的存储空间

       int front;                      //头指针

       int rear;                       //尾指针

}SqQueue;

循环队列的基本特点有:

无法动态地分配空间只能用固定长度的数组表示

入队:   sq[rear]=x;

  rear=(rear+1)%M;   

                

出队:        x=sq[front];

 front=(front+1)%M;   

                

队列初始化:front = rear = 0;

队空条件:front == rear

队满条件:front = (rear+1)%maxsize

初始化一个队列

       void initQueue(SqQueue &q){

                     Q.base =(ElemType*)malloc(MAXSIZE*sizeof(ElemType));

              if(!Q.base) exit(ERROR);

Q.front = Q.rear=0;

}

 

求队列的长度

intQueueLength(SqQueue Q)

{

  return (Q.rear – Q.front +MAXQSIZE)%MAXQSIZE;

}

入队

StatusEnQueue(SqQueue &Q, QElemType e)

{

  if((Q.rear+1)%MAXQSIZE == Q.front)

    return ERROR;

  Q.base[Q.rear] = e;

  Q.rear = (Q.rear+1) % MAXQSIZE;

  return OK; }

出队

StatusDeQueue(SqQueue &Q, QElemType &e)

{

  if(Q.front == Q.rear)    return ERROR;

  e = Q.base[Q.front];

  Q.front = (Q.front+1) % MAXQSIZE;

  return OK; }


 

综上两种特点在选择队列的时候如果出现长度无法估计就用链队列!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值