#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;
}
此时初始化,进栈和出栈的关键代码需要更改,
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
栈与队列不是很难,考一些简单的代码。内容不多。还有选择题的计算,一定要理清他们的区别,先进后出,先进先出。注意逻辑
栈与队列主要难在下一篇,栈与队列的应用。