王道考研 数据结构之栈与队列
栈和队列知识结构图
栈和队列代码
一、栈
1.顺序栈
1)顺序栈存储定义
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放栈中元素的最大个数
int top; //栈顶指针
}SqStack;
2)顺序栈基操
-
初始化
void InitStack(&s){ s.top = -1; //初始化栈顶指针 //或者s.top = 0; 相当于规定top指向栈顶元素的下一个存储单元 }
-
判空
bool StackEmpty(S){ if(S.top == -1) //栈空 return false; else //栈不空 return true; }
-
进栈
bool Push(SqStack &S, ElemType x){//栈S 进栈元素x //1.判断栈是否满 if(S.top == MaxSize - 1) return flase; //2.栈顶指针加一,再将值送到栈顶(加一后的栈顶) S.top[++S.top] = x; return true; }
-
出栈
bool Pop(SqStack &S, ElemType &x){//栈S 出栈元素x //1.判断栈是否空 if(S.top == -1) return flase; //2.先取栈顶元素值,再将栈顶指针减一 x = S.data[S.top--]; return true; }
-
获取栈顶元素
bool GetTop(SqStack &S, ElemType &x){ //1.判断栈是否为空 if(S.top == -1) return false; //2.获取栈顶元素 x = S.data[S.top]; return true; }
2.链式栈
链式栈存储定义
typedef struct LinkNode{
ElemType data; //数据域
struct LinkNode *next; //指针域
}*LiStack;
入栈和出栈操作分别在表头进行插入和删除,带头结点和不带头结点操作不同
二、队列
1.顺序队列
1)顺序队列存储定义
#define MaxSize 50 //定义队列中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放队列元素
int front,rear; //队头指针和队尾指针
}SqQueue;
2)循环队列基操
-
初始化
void InitQueue(SqQueue &Q){ //初始化队首、队尾指针 Q.rear = Q.front = 0; }
-
判空
bool isEmpty(SqQueue Q){ //1.判断队列是否为空,队首指针和队尾指针相等 if(Q.front == Q.rear) return true; else return flase; }
-
入队
bool EnQueue(SqQueue &Q, ElemType x){//队列Q,入队元素x //1.判断队是否满,牺牲一个单元来区分队空和队满方法 if((Q.rear +1) % MaxSize == Q.front) return false; //2.先送值到队尾元素,再将队尾指针加一取模 Q.data[Q.rear] = x; Q.rear = (Q.rear + 1) % MaxSize; retrun true; }
-
出队
bool DeQueue(SqQueue &Q, ElemType &x){//队列Q,出队元素x //1.判断队是否空,牺牲一个单元来区分队空和队满方法 if(Q.rear == Q.front) return false; //2.先取队首元素,再将队头指针加一取模 x = Q.data[Q.front]; Q.front = (Q.front + 1) % MaxSize; retrun true; }
2.链式队列
1)链式队列存储定义
typedef struct{ //链式队列结点
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;
2)链式队列基操
-
初始化
void InitQueue(LinkQueue &Q){ //1.建立头结点 Q.rear = Q.front = (LinkNode *)malloc(sizeof(LinkNode)); //2.初始化为空 Q.front->next = NULL; }
-
判空
bool isEmpty(LinkQueue Q){ //1.判断队列是否为空,队首指针和队尾指针相等 if(Q.front == Q.rear) return true; else return flase; }
-
入队
void EnQueue(LinkQueue &Q, ElemType x){//队列Q,入队元素x //1.创建新结点 LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //2.插入到链尾 s->data = x; //将入队元素放进新建结点s的数据域中 s->next = NULL; //结点s指向空 Q.rear->next = s; //队尾指针指向结点s Q.rear = s; //将s赋给队尾指针(此时队尾指针变为s,s指向空) }
-
出队
bool DeQueue(LinkQueue &Q, ElemType &x){//队列Q,出队元素x //1.判断队是否空 if(Q.rear == Q.front) return false; //2.从链表头删除,令p指向队首元素结点 LinkNode *p = Q.front->next; //3.队首(出队)元素赋值给x x = p->data; //4.将p结点从链表中断开 Q.front->next = p->next; //5.如果原队列中只有一个结点,删除后变空 if(Q.rear == p) Q.rear = Q.front; //6.释放p结点 free(p); retrun true; }
三、应用
栈在递归中的作用(斐波那契)
int Fib(n){//斐波那契数列实现
if(n==0)
return 0;//边界条件(递归出口)
else if(n==1)
return 1;//边界条件(递归出口)
else
return Fib(n-1)+Fib(n-2);//递归表达式(递归体)
}
合集:
数据结构之线性表
数据结构之栈与队列
数据结构之串
数据结构之树与二叉树
数据结构之图
数据结构之查找
数据结构之排序