关于栈:栈与队列

1.栈是只运行在一端操作的线性表。n个元素进栈,出栈元素不同排列个数为2n!/n!/(n+1)

一般栈:
#define Maxsize 10
typedef struct{
     ElemType data[Maxsize];
     int top;......栈顶指针,因为栈实质上是数组,所以指针能够简化为一个数
}Sqstack;

共享栈:
typedef struct{
     ElemType data[Maxsize];
     int top0;
     int top1;
}Shstack;

void InitStack(Shstack &S){
     S.top0=-1;
     S.top1=Maxsize;
}
栈满条件:top0+1=top1

2.队列是在一端进,一端出的线性表

#define Maxsize 10
typedef struct{
     ElemType data[Maxsize];
     int front,rear;
}SqQueue;

3.队列的插入与删除
因为队列波及到来头尾的问题,所以为了运算不便,咱们应用模运算将队列在逻辑上变为环形

bool EnQueue(SqQueue &Q,Elemtype x){
       if((Q.rear+1)%MaxSize==Q.front)
                 return false;
       Q.data[Q.rear]=x;
       Q.rear=(Q.rear+1)%Maxsize;
       return true;
}

bool DeQueue(SqQueue &Q,Elemtype &x){
       if(Q.rear+1==Q.front)
                 return false;
       Q.data[Q.front]=x;
       Q.front=(Q.front+1)%Maxsize;
       return true;
}

4.判断队列空满的形式
计划一:

就义了一个存储空间(即rear指向的那个地位)

计划二:

计划三:

5.其余出题形式

有时rear指向的是队尾元素所在位置(起始时rear=front=0)(后面所写代码和判断形式均建设在这种形式上),有时指向的是队尾元素的下一个地位(起始时rear=n-1,front=0)

前一种:
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%Maxsize;

后一种:
Q.rear=(Q.rear+1)%Maxsize;
Q.data[Q.rear]=x;

然而对于后一种,咱们不能通过(Q.rear+1)%MaxSize==Q.front判断队满,因为它的队空是这样判断的,因而咱们能够就义一个存储单元,即当rear=n-2,front=0时就队满,或者通过设置size来判断

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理