一对一逻辑关系 线性表
顺序表 :
链表 :
栈和队列
栈:数据关系
先进后出 后进先出一种数据结构
max : 表示栈大小
top : 表示栈顶指针 或者 栈底指针
入栈 压栈 :保存数据
出栈 弹栈 :读取数据
满栈:
top == max
如果是满栈,则不可以压栈
空栈:
top == 0
如果是空栈,则不可以弹栈
数栈:顺序标封装栈
链栈:链表封装栈
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义栈的大小
#define MAX 10
//判断是否是满栈
int is_full(int top)
{
if (top == MAX)
return 1;
return 0;
}
//判断是否是空栈
int is_empty(int top)
{
if (top == 0)
return 1;
return 0;
}
//压栈函数
void push(int data, int *stack, int *top)
{
//1 判断是否是满栈
if (is_full(*top))
{
return ;
}
// 2 保存数据
stack[*top] = data;
//3 偏移栈顶指针
(*top)++;
return ;
}
//出栈
int pop(int *stack, int *top)
{
// 1 判断是否是空栈
if (is_empty(*top))
return -1;
// 2 栈顶指针偏移
(*top)--;
// 3 返回
return stack[*top];
}
//遍历
void travel(int *stack)
{
int i;
for (i = 0; i < MAX; i++)
{
printf("%d ", stack[i]);
}
putchar(10);
}
int main(void)
{
int i;
int num;
//定义栈
int stack[MAX];
//栈顶指针
int top = 0;
for (i = 0; i < MAX + 2; i++)
{
num = rand() % 100;
printf("%d ", num);
//压栈
push(num, stack, &top);
}
putchar(10);
//遍历
travel(stack);
printf("pop : %d\n", pop(stack, &top));
printf("pop : %d\n", pop(stack, &top));
push(100, stack, &top);
for (i = 0; i < MAX; i++)
printf("pop : %d\n", pop(stack, &top));
return 0;
}
=========================================
队列:循环队列 int
特性:先进先出 后进后出
大小:max = 10
队头:frist = 0
队尾:end = 0
满队:
(end + 1) % max == front
空队:
front == end
入队:
end
1 判断是否是满队
2 保存数据
3 end++
4 判断end是否等于max
如果等于max,则end = 0
出队:
front
1 判断是否是空队
2 出数据
3 front++
4 判断是否等于max
front = 0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//队列大小
#define MAX 10
//判断是否是满队
int is_full(int front, int end)
{
return ((end + 1) % MAX == front) ? 1 : 0;
}
//判断是否是空队
int is_empty(int front, int end)
{
return (front == end) ? 1 : 0;
}
//实现入队 end
void qe(int data, int *queue, int front, int *end)
{
// 1 判断是否是满队
if (is_full(front, *end))
return ;
// 2 保存数据
queue[*end] = data;
// 3 end偏移
(*end)++;
// 4 判断
if (*end == MAX)
*end = 0;
}
//实现出队
int de(int *queue, int *front, int end)
{
int tmp;
// 1 判断是否空队
if (is_empty(*front, end))
return -1;
// 2 出数据
tmp = queue[*front];
// 3 偏移
(*front)++;
// 4 判断是否越界
if (*front == MAX)
*front = 0;
return tmp;
}
//求数据个数
int len(int front, int end)
{
if (end > front)
return end - front;
return MAX - (front - end);
}
//遍历
void travel(int *queue, int front, int end)
{
int i, j;
for (i = 0, j = front; i < len(front, end); i++, j++)
{
if (j == MAX)
j = 0;
printf("%d ", queue[j]);
}
printf("\n");
}
int main(void)
{
int i;
int num;
int queue[MAX];//定义一个队列
int front = 0;//表示队头
int end = 0;//表示队尾
//接受数据
for (i = 0; i < MAX; i++)
{
num = rand() % 100;
printf("%d ", num);
//入队
qe(num, queue, front, &end);
}
printf("\n");
travel(queue, front, end);
//遍历
printf("de : %d\n", de(queue, &front, end));
printf("de : %d\n", de(queue, &front, end));
qe(100, queue, front, &end);
qe(101, queue, front, &end);
qe(102, queue, front, &end);
travel(queue, front, end);
return 0;
}