数据结构栈与队列

一对一逻辑关系 线性表
顺序表 :
链表 :
栈和队列

栈:数据关系
先进后出 后进先出一种数据结构

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值