堆栈和队列的数据结构和相关操作总结
来源:互联网 发布: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;}
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
- 堆栈和队列的数据结构和相关操作总结
- 数据结构-堆栈和队列
- 【数据结构】堆栈和队列
- 数据结构--堆栈和队列
- 数据结构堆栈和队列
- 数据结构堆栈和队列
- 数据结构-堆栈和队列
- 数据结构-堆栈和队列的实验
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- Java数据结构--------堆栈和队列
- java 数据结构----------堆栈和队列
- 堆栈和队列知识总结
- Java语言对数据结构中“队列”和“堆栈”的支持
- Java 模拟堆栈和队列的数据结构存储
- 堆栈和队列的基本用法和操作
- 数据结构——队列、堆栈和哈希表
- 数据结构归纳——队列和堆栈
- 数据结构——堆栈和队列
- fn
- 串口UART原理
- DirectX学习笔记(四):利用D3DX网格数据结构绘制可旋转茶壶
- 编程珠玑第10章--性能之节省空间
- java网络编程,非常详细,适合初学者的java网络编程知识(转载)
- 堆栈和队列的数据结构和相关操作总结
- linux c——进程管理
- 外部中断0——51程序
- 理解HashMap
- linux解压&压缩
- TCP连接与断开详解(socket通信)
- html5标签及属性小结
- C++语法的摘要
- 世界各地贺中秋习俗