C++学习(三十)(C语言部分)之 栈和队列

时间:2024-04-24 09:18:02

数据结构
1.保存数据 2.处理数据
数组+操作
增查删改

栈和队列
是一种操作受限的线性表

栈 是先进后出 是在一端进行插入删除的操作--->栈顶 另一端叫做栈底(栈和栈区是两个概念)(是一种数据结构)
队列 是先进先出 是在两端进行插入删除的操作 在插入的一端叫做队尾 在删除的一端叫做队头

栈 需要回退操作 退回上一步(悔棋)
队列 多用于和时间有关的 比如消息(鼠标点击消息 键盘消息) 先来的先处理-->服务器请求
(举个比较恶心的例子 吃了吐--->栈 吃了拉---->队列)

例子
1、进制转换(栈)
2、队列的例子 入队 出队

测试代码笔记如下:

 //用栈实现 进制转换
#if 0
#include<stdio.h>
#include<stdbool.h> //判断真假 c++中的
//栈 1.线性表 (顺序表 链表的实现)
struct STACK
{
int arr[]; //数组
int size; //栈的大小 栈中最多可以存放多少的元素
int top; //栈顶 栈中不关心有多少元素 关心的是插入删除的位置
}; //初始化栈
void initStack(struct STACK*p)
{
p->top = ; //表示没有任何元素
p->size = ; //栈的大小
//栈顶就是即将要插入的数据的位置
//栈 是否是满 top==size
//top==0 表示栈中没有元素
} //栈的插入 入栈/压栈
void pushStack(struct STACK*p,int data)
{
if (p->top >= p->size)//表示栈满
{
printf("栈满,压栈失败!\n");
}
else
{
p->arr[p->top++] = data;
}
} //栈的删除 出栈
int popStack(struct STACK*p) //出一个元素 需要在外面得到这个元素 需要返回值
{
if (p->top <= ) //栈空
{
printf("没有元素,出栈失败!\n");
return ;
}
else
{
return p->arr[--(p->top)]; //出最后一个元素
}
} //判断栈是否为空
int isStackEmpty(struct STACK*p) //操作栈的时候会用
{
return p->top <= ; //返回值是1表示空 不然栈没空
} int main()
{
//进制转换 代码实现 不断除2求余 直到除到0的位置
//栈实现 余数栈
//十进制转换
int x = ;
printf("要转换的值是:%d\n", x);
//scanf_s("%d", &x);
struct STACK stack;
initStack(&stack); //栈初始化
while (x != )
{
pushStack(&stack, x % );
x /= ; //或x>>=1; 右移等于1相当于除以二 比除法快
}
//入完栈之后 出栈
printf("转换出的二进制是:");
while (isStackEmpty(&stack) != ) //表示栈没有空
{
printf("%d", popStack(&stack)); //出栈 %x打印16进制
}
//对于其他进制
//入栈 做处理 10-15 用A-F替换 -->if
getchar();
return ;
}
#endif /***************************分割线*********************************/
//队列的例子 队尾插入 队头删除
#if 1
//队
struct QUEUE
{
int arr[];
int size;
int begin; //队头
int end; //队尾
}; //初始化
void initQueue(struct QUEUE*p)
{
p->begin = p->end = ; //刚刚开始队列没有元素
p->size = ; //数组下标
/*
begin==end 队空
end+1-->begin的位置 队满
*/
} //入队 队尾操作
void inQueue(struct QUEUE*p, int data)
{
if ((p->end + ) % p->size == p->begin) //判断队列是否已满
{
return; //队列已满情况 只是表示退出函数 没有别的意思
}
else
{
p->arr[p->end++] = data; //插入
p->end %= p->size; //保证end+1之后 最后的end还是小于size
}
} //出队 队头操作
int outQueue(struct QUEUE*p)
{
if (p->begin == p->end) //队空 不操作 判断队是否满
{
return ; //返回一个0
}
else
{
int x = p->arr[p->begin]; //要出队的元素
p->begin = (p->begin + ) % p->size; //防止begin往后移动之后 等于size
return x; //返回要出队的元素
}
} int main()
{
struct QUEUE queue;
initQueue(&queue);
int y = ;
//入队
while (y != )
{
inQueue(&queue, y % ); //将余数入队
y >>= ;
}
//出队
while (queue.begin!=queue.end)
{
printf("%x", outQueue(&queue));
} getchar();
return ;
}
#endif #if 0
//ctf比赛 密码部分
//flag{c4es4r_variation}
//bg[`sZ*Zg'dPfP`VM_SXVd
#include<stdio.h>
int main()
{
int arr[] = { , , , , , , , , , , , , , , , , , , , , , };
printf("原样输出:\n");
for (int i = ; i < ; ++i)
{
printf("%d\t", arr[i]);
}
printf("\n");
printf("进行运算:\n");
int brr[] = { ,,,,,,,,,,,,,,,,,,,,, };
printf("结果输出:\n");
int crr[];
for (int i = ; i < ;++i)
crr[i] = arr[i] + brr[i];
for (int i = ; i < ; ++i)
printf("%d\t", crr[i]);
getchar();
return ;
}
#endif

附:

C++学习(三十)(C语言部分)之 栈和队列

2019-03-31  19:41:48