大话数据结构笔记————栈和队列
栈:是限定仅在表尾进行插入和删除操作的线性表。
栈的顺序存储结构
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[S->top]; S->top--; return OK; }
栈的链式存储结构
typedef struct StackNode { SElemType data; struct StacktNode *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) { LinkStackPtr p; if(StackEmpty(*S)) return ERROR; *e=S->top->data; p=S->top; S->top=S->top->next; free(p); S->count--; return OK; }
斐波那契数列
int Fbi(int i) { if(i<2) return i==0?0:1 return Fbi(i-1)+Fbi(i-2); } int main() {for(int i=0;i<40;i++) printf("%d",Fbi(i)); return 0; }
队列:是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
循坏队列:头尾相接的顺序存储结构的队列。
front==rear,队列为空;
(rear+1)&QueueSize == front,队列为满。
typedef struct { QElemType data[MAXSIZE]; int front; int rear; }SqQueue;
入队:Q->rear=(Q->rear+1)%MAXSIZE;
出队: Q->front=(Q->front+1)%MAXSIZE;
队列的链式存储结构
typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front,rear; }LinkQueue;
初始化
Status InitQueue(LinkQueue *q) { q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
exit(OVERFLOW); q->front->next = 0;
return OK; }
入队
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->rear=s; return OK; }
出队
Status DeQueue(LinkQueue *Q,QElemType *e) { QueuePtr p; if(Q->front ==Q->rear) return ERROR; p=Q->front->next; *e=p->data; Q->front->next=p-next; if(Q->rear==p) Q->rear=Q->front; free(p); return OK; }