#define MaxSize 50 typedef struct{ ElemType data[MaxSize]; //存放栈的中元素 int top; //栈顶指针 }
void InitStack(SqStack &S){ S.top=-1; //初始化栈顶指针为-1 }
bool StackEmpty(SqStack &S){ if(S.top==-1) //栈空 return true; else return false; }
bool Push(SqStack &S,ElemType x){ if(S.top == MaxSize -1) //栈满,报错 return false; S.data[++S.top] = x; //这条是核心 return true; // 这一段代码可能有一点变化,考试可能会把初始S.top设置为0;这样的话, }
bool Pop(SqStack &S,ElemType &x){ if(S.top == -1) //栈空,报错 return false; x=S.data[S.top--]; //这段是核心 return true; }
bool GetTop(SqStack &S,ElemType &x){ if(S.top == -1) //栈空报错 return false; x=S.data[S.top]; return true; }
有的题目会把指针由-1变为0。如下图
此时初始化,进栈和出栈的关键代码需要更改,
top0=-1
,表示从下往上的栈0为空;top1=maxSize
,表示从上往下的栈1为空;当top1-top0=1时
,表示两个栈都满了。#define MaxSize 10 typedef struct{ ElemType data[MaxSize]; int top0; //0号栈顶指针 int top1; //1号栈顶指针 }
void InitStack(ShStack &S){ S.top0 = -1; S.top1 =MaxSize; }
typedef struct LinkNode{ ElemType data; //数据域 struct LinkNode *next;//指针域 } *LiStack;
define MaxSize 50 typedef struct{ ElemType data[MaxSize]; int front,rear; }SqQueue;
一般顺序队列如下
但是 队列是一个线性表,一直往上移会出现指针出界,所以一般都是把队列想象成一个环状 这样就不会出现上面的情况。
所以 一般考试中,所讨论的队列都是循环队列 ,这个一定要理解。不然不知道怎么突然来的循环队列
void InitQueue(SqQueue &Q){ Q.rear = Q.front = 0; //初始化队首,队尾指针 }
bool isEmpty(SqQueue Q){ if(Q.rear == Q.front) return true; else return false; }
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 == Q.front) //队空报错 return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%MaxSize; //队头指针+1 return true; }
#define MaxSize 10 typedef struct{ ElemType data[MaxSize]; int front,rear; }SqQueue;
#define MaxSize 10 typedef struct{ ElemType data[MaxSize]; int front,rear; int size; //队列当前长度 }SqQueue;
#define MaxSize typedef struct{ ElemType data[MaxSize]; int front,rear; int tag; //最近一次的删除/插入 删除:0 插入:1 }SqQueue;
实际是一个同时带有队头指针和队尾指针的单链表。如图
其结构体为(了解)
typedef struct{ ElemType data; struct LinkNode *next; }LinkNode; typedef struct{ LinkNode *front,*rear; }LinkQueue;
void InitQueue(LinkQueue &Q){ Q.rear = Q.front = (LinkNode *)malloc(sizeof(LinkNode)); //建立头结点 Q.front->next =NULL;//初始为空 }
bool isEmpty(LinkQueue Q){ if(Q.rear == Q.front) return true; else return false; }
void EnQueue(LinkQueue &Q,Elemtype x){ LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = x;s->next =NULL;//创建新结点,插入到链尾 Q.rear->next = s; Q.rear=s; }
bool DeQueue(LinkQueue &Q,ElemType &x){ if(Q.rear == Q.front) //队空报错 return false; LinkNode *p=Q.front->next; x = p->data; Q.front->next = p->next; if(Q.rear == p) Q.rear = Q.front; //若原队列中只有一个结点,删除后变空 free(p) return true; }
这部分会考选择题,理解它什么功能会手算模拟就行
允许两端都可以进行入队和出队操作。逻辑结构仍然是线性。如图。
这个地方可以做几个题目,关键还是注重逻辑分析。举个例子
某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作。若元素abcde依次入队再进行出队操作。不可能得到得序列。A. bacde B. dbace C. dbcae D.ecbad
栈与队列不是很难,考一些简单的代码。内容不多。还有选择题的计算,一定要理清他们的区别,先进后出,先进先出。注意逻辑
栈与队列主要难在下一篇,栈与队列的应用。