栈、队列
递归
1、定义:把一个直接调用自己或通过一系列的调用语句间接的调用自己的函数,称为递归函数。
2、特点:每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回退出.
3、迭代和递归的区别:迭代使用循环结构,递归使用选择结构。
4、编译器使用栈来实现递归。
栈的应用——四则运算表达式求值
中缀表达式转后缀表达式:
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止.(栈用来进出运算符号)
进出运算数字:
规则:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果.(栈用来进出运算的数字)
队列
1、定义:队列是只允许在一端进行插入操作,而在另一端进行删除的先进先出的线性表,简称FIFO,允许插入的一端叫队尾,允许删除的一端称为队头。
注意:为了避免队列中只余一个元素,队头和队尾重合,所以引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,当front等于rear时,为空队列.
2、循环队列
队列的头尾相接的顺序存储结构称为循环队列。
3、判断队列是否已满
①设置一个标志变量flag,当frontrear,且flag=0时队列为空,当frontrear,且flag=1为队满
②保留一个元素空间
队满条件:
(rear+1)% QueueSize==front
//循环队列的顺序存储结构代码
typedef int QElemType;
typedef struct
{
QElemType data[MAXSIZE];
int front;
int rear;
}SqQueue;
//初始化一个空队列
Status InitQueue (SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return OK;
}
//循环队列求队列长度
//返回Q的元素个数,也就是队列的当前长度
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//循环队列的入队列操作
Status EnQueue(SqQueue *Q,QElemType e)
{
if((Q->rear+1)%MAXSIZE==Q->front)//队列满的判断
return ERROR;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
//循环队列的出队列操作
//若队列不空,则删除Q中的队头元素,用e返回其值
Status DeQueue(SqQueue *Q,QElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;//front指针向后移一位置,若到最后则转到数组头部;
return OK;
}
队列的链式存储结构其实就是线性表的单链表,只能尾进头出,称为链队列.
//队列的链式存储结构及实现
//链队列结构
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
//队列链式存储结构——入队操作
Status EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode))
if(!s)//存储分配失败
exit(OVERFLOW);
s->data=e;
s->next=NULL;
Q->rear->next=s;//把拥有元素e的节点赋值给原队尾节点的后继
Q->rear=s;
return OK;
}
//队列的链式存储结构——出队操作
//若队列不空,删除Q的队首元素,用e返回其值,并返回OK,否则返回EOORO
Status DeQueue(LinkQueue *Q,QElemType *e)
{
QueuePtr p;
if(Q->front==Q->rear)
return ERROR;
p=Q->front->next;//将欲删除的队头节点暂存给p
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p)//若队头是队尾,则删除鹄将
Q->rear=Q->front;
free(p);
return OK;
}