index 数据结构与算法
栈(stack)
栈是一种先进后出的数据结构,浏览器的“后退,前进”键就是通过栈的结构来实现的,深度优先遍历(dfs、递归)的也会用到栈,栈(Stack)是限定仅在表尾进行插入和删除的线性表
顺序存储结构
typedef int SElemType;
typedef struct{
SElemType data[MAXSIZE];
int top;
}SqStack;
Status Push(SqStack *S, SElemType e){
if(S->top == MAXSIZE-1){
return ERROR;
}
S->top++;
S->data[S->top]=e;
return OK;
}
Status Pop(SqStack *S, SElemType *e){
if(S->top == -1)
return ERROR;
*e=S->data[top];
S->top--;
return OK;
}
链式存储结构
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top; //栈顶指针
int count;
} LinkStack;
Status Push(LinkStack *S, SElemType e){
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data=e;
s->next=S->top;
S->top=s;
S->count++;
return OK;
}
Status Pop(LinkStack *S, SElemType *e){
if(S->count <= 0)
return ERROR;
*e=S->top->data;
LinkStackPtr p=S->top;
S->top=p->next;
free(p);
S->top--;
return OK;
}
栈的作用
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。反之,像数组等,因为要分散精力去考虑数组下标增减等细节问题,反而掩盖了问题的本质。
队列(queue)
队列是一种先进先出的数据结构,队列在程序设计中用的非常频繁
链式存储结构
typedef int QElemType;
typedef struct QNode{ //结点结构
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{ //链表结构
QueuePtr front, rear;
}LinkQueue;
//入队,队列结构:front->...mid->...rear
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;
Q->next=s;
return OK;
}
//出队
Status DeQueue(LinkQueue *Q, QElemType *e){
QueuePtr p;
if(Q->rear == Q->front) return ERROR;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear == p)
Q->rear=Q->front;
free(q);
return OK;
}