堆栈和队列的数据结构和相关操作总结

来源:互联网 发布:linux 命令行刻录光盘 编辑:程序博客网 时间:2024/06/06 13:15

一、栈的操作

1、栈结构的顺序存储定义:

typedef struct Sqstack{int data[MAXSIZE];int top; //top为指向栈的顶层的数组下标};


入栈操作:

#define OK 1;#define ERROR 0;#define MAXSIZE 20;int Push(Sqstack *s, int e){if (s->top == MAXSIZE - 1)  //满栈return ERROR;s->top++;s->data[s->top] = e;return OK;}

出栈操作;

int Pop(Sqstack *s, int *e){if (s->top == -1) //空栈return ERROR;*e = s->data[s->top];s->top--;return OK;}

两个栈共享空间(即用两个top指针且共用一个数组空间)

typedef struct Sqdoublestack{int data[MAXSIZE];int top1;int top2;};
其余操作类似,只需判别top1和top2是否重叠即可


2、栈的链式存储结构

typedef struct StackNode{   //定义栈结点结构int data;struct StackNode *next;}*LinkPtr; typedef struct LinkStack{  //定义链栈结构LinkPtr top;  //定义栈顶指针topint count;   //定义栈长度;};


入栈
nt Push(LinkStack *s, int e){LinkPtr p = (LinkPtr)malloc(sizeof(StackNode));if (!p)exit(OVERFLOW);  //内存满p->data = e;p->next = s->top;s->top = p;s->count++;return OK;


出栈
int Pop(Linkstack *s, int *e){LinkPtr p;if (s->top == NULL)  //空栈return ERROR;*e = s->top->data;p = s->top;s->top = p->next;free(p);s->count--;return OK;}


二、循环队列的操作

循环队列是存储空间可以从后面的位置满了之后,可以循环存储到前面的空位置的队列。因此就需要有两个指针front和rear来指向头和尾部。

1、顺序存储结构定义:

//循环队列的顺序存储结构typedef struct SqQueue{int data[MAXSIZE];int front; //指向队列头位置的数组下标,出队列时候其值改变int rear; //指向队列尾元素的下一个空位置的数组下标,入队列时候改变其位置};

初始化:

#define OK 1;#define ERROR 0;#define MAXSIZE 20;//初始化队列int IniQueue(SqQueue *Q){Q->front = 0;Q->rear = 0;return OK;
入队列:
int EnQueue(SqQueue *Q, int e){if((Q->rear+1)%MAXSIZE==Q->front)  //满队列return ERROR;Q-data[Q-rear]=e;Q->rear=(Q->rear+1)%MAXISIZE;return OK;
出队列:

int DeQueue(SqQueue *Q, int *e){if (Q->front==Q->rear) //空队列return ERROR;*e=Q->data[Q-front];Q->front=(Q->front+1)%MASIZE;return OK;}


2、链式队列结构定义

typedef struct QNode{   //定义队列结点结构int data;struct QNode *next;}*QPtr; typedef struct LinkQueue{  //定义链式队列结构QPtr front;  //这里的front指针指向的是头结点,头结点没有data信息QPtr rear;   //这里的rear指针不再是指向下一个空位置,而是指向链式队列的尾元素};

入队列:

int EnQueue(LinkQueue *Q, int e){QPtr p = (QkPtr)malloc(sizeof(QNode));if (!p)exit(OVERFLOW);  //内存满p->data = e;Q->rear->next=p;  //把之前队尾元素和新创建节点链接起来Q->rear = p;   //把rear指向队尾元素p->next=NULL;return OK;

出队列:

int DeQueue(LinkQueue *Q, int *e){QPtr 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;  //若只有一个元素,出队列后,队头是队尾,则将rear指向头结点free(p);return OK;}








0 0
原创粉丝点击