栈
注意事项:
- S.top=-1,栈顶指针指向的就是栈顶元素,进栈时的操作是指针先加1,再入栈,S.data[++S.top]=x;出栈时的操作,先出栈,指针减1,x=S.data[S.top--];如果栈顶指针初始化S.top=0,即栈顶指针指向栈顶元素的下一个位置,则入栈操作变为S.data[S.top++]=x;出栈时的操作x=S.data[--S.top];
- 对于n个不同的元素进栈,出栈序列的个
队列
- 循环队列,区分队空还是队满的情况,有三种处理方式
- 牺牲一个单元来区分队空和堆满,入队时少用一个队列单元,队头指针在 队尾指针的下一位置作为队满的标志。
队满条件:(Q.rear+1)%MaxSize==Q.front
队空条件:Q.front==Q.rear
队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize
2、类型中增设表示元素个数的数据成员
队满条件:Q.size==MaxSzie
队空条件:Q.size==0
这两种情况都有Q.front==Q.rear
3、类型中增设tag数据成员,以区分是队满还是队空。
tag==0时,若因删除导致Q.front==Q.rear则为队空;tag==1 时,若因插入导致Q.front==Q.rear则未队满
- 循环队列操作
//(1)初始化,不是为了判断队空
void InitQueue(&Q){
Q.rear=Q.front=0;
}
//(2)判队空
bool isEmpty(Q){
if(Q.rear==Q.front)
return true;
else
return false;
}
//(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;
}
//(4)出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front) return false; //队空报错
x=Q.data[Q.front];
Q.front==(Q.front+1)%MaxSize;
return true;
}
//入队
void EnQueue(LinkQueue &Q,ElemType x){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;s->next=NULL; // 创建新结点,插入到链尾
Q.rear->next=x;
Q.rear=s;
}
//出队
void DnQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear) return false; //空队
p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front; //若原队列中只有一个结点,删除后变空
free(p);
}
以下为栈和队列的思维导图