目录
TwoStacksImplementationQueue.h(头文件)
TwoStacksImplementationQueue.c(函数文件)
QueueImplementationStack.h(头文件)
QueueImplementationStack.c(函数文件)
栈:
后进先出,即只能对最晚的元素进行操作。
通常使用一个指针来指示栈顶的位置。
队列:
先进先出,即只能对最早的元素进行操作。
通常使用队头和队尾两个指针。
废话不多说,直接上代码。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
STDataType* a; //数组指针
int top; // 栈顶
int capacity; // 容量
}Stack;
void StackInit(Stack* ps);// 初始化栈
void StackResize(Stack* ps); //用于动态扩容,防止空间不够
void StackPush(Stack* ps, STDataType data);// 入栈
void StackPop(Stack* ps);// 出栈
STDataType StackTop(Stack* ps);// 获取栈顶元素
int StackSize(Stack* ps);// 获取栈中有效元素个数
int StackFull(Stack* ps);// 检测栈是否为满,如果为满返回非零结果,如果不为满返回0
int StackEmpty(Stack* ps);// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
void StackDestroy(Stack* ps);// 销毁栈
#include"Stack.h"
void StackInit(Stack* ps) //初始化栈
{
ps->a = (STDataType*)malloc(sizeof(STDataType) * 10);
if (ps->a == NULL)
{
printf("fail malloc\n");
exit(-1);
}
ps->top = -1;
ps->capacity = 10;
}
void StackResize(Stack* ps) //用于动态扩容,防止空间不够
{
ps->capacity *= 2;
ps->a = (STDataType*)malloc(sizeof(STDataType) * ps->capacity);
if (ps->a == NULL)
{
printf("fail malloc\n");
exit(-1);
}
}
void StackPush(Stack* ps, STDataType data) //入栈操作
{
if (StackFull(ps))
{
StackResize(ps);
}
ps->a[++ps->top] = data;
}
void StackPop(Stack* ps) //出栈操作
{
if (StackEmpty(ps))
{
printf("Stack is empty.\n");
exit(-1);
}
printf("%d ", ps->a[ps->top]);
ps->top--;
}
STDataType StackTop(Stack* ps) //获取栈顶元素,但不出栈
{
if (StackFull(ps))
{
printf("Stack is stackfull.\n");
exit(-1);
}
return ps->a[ps->top];
}
int StackSize(Stack* ps) //获取栈里有效元素个数
{
return ps->top + 1;
}
int StackFull(Stack* ps) //检查栈是否为满
{
return ps->top == ps->capacity - 1;
}
int StackEmpty(Stack* ps) //检查栈是否为空
{
return ps->top == -1;
}
void StackDestroy(Stack* ps) //销毁栈
{
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = -1;
}
#include"Stack.h" //不要忘了保函以及实现好了的栈
typedef struct {
Stack pushst; //该栈用来实现插入队列元素
Stack popst; //该栈用来实现出队列元素
} MyQueue;
MyQueue* myQueueCreate(); //得先初始化一下MyQueue里的两个栈
void myQueuePush(MyQueue* obj, int x); //入队列
int myQueuePeek(MyQueue* obj); //返回队列开头的元素
int myQueuePop(MyQueue* obj); //出队列
bool myQueueEmpty(MyQueue* obj); //判断队列是否为空
void myQueueFree(MyQueue* obj);//销毁栈
#include"TwoStacksImplementationQueue.h" //不要忘了包含头文件
MyQueue* myQueueCreate() //得先初始化一下MyQueue里的两个栈
{
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
StackInit(&obj->pushst);
StackInit(&obj->popst);
return obj;
}
void myQueuePush(MyQueue* obj, int x)
{
//这里的入队列功能就由一个栈来实现,所以只需要调用栈的入栈功能来驱动其中一个栈
StackPush(&obj->pushst, x);
}
int myQueuePeek(MyQueue* obj) //返回队列开头的元素,但删除该元素
{
if (StackEmpty(&obj->popst)) //如果负责出元素的栈不为空,则直接出元素
{
while (!StackEmpty(&obj->pushst))
//如果负责出元素的栈为空,则就把负责入元素的栈里的元素转移到出元素的栈里这样栈里元素就实现了整体反转
{
StackPush(&obj->popst, StackTop(&obj->pushst));
StackPop(&obj->pushst);
}
}
return StackTop(&obj->popst);
}
int myQueuePop(MyQueue* obj)//出队列头元素
{
int front = myQueuePeek(obj);//利用myQueuePeek函数使队列头元素位于只负责出队列功能的栈里,并读取保存
StackPop(&obj->popst);//在利用栈的出栈功能把队列头元素删除。
return front;
}
bool myQueueEmpty(MyQueue* obj)//判断队列是否为空
{
return StackEmpty(&obj->popst) && StackEmpty(&obj->pushst);
//判断队列是否为空的条件就是,负责出队列功能和入队列功能的两个栈都要是空的才可以。
}
void myQueueFree(MyQueue* obj)//销毁栈
{
StackDestroy(&obj->popst);
StackDestroy(&obj->pushst);
free(obj);
}
#include<stdio.h>
#include<stdlib.h>
// 链式结构:表示队列
typedef int QDataType;
typedef struct QListNode //队列的元素结构体
{
struct QListNode* next;
QDataType data;
}QNode;
typedef struct Queue //队列的头指针和尾指针
{
QNode* front;
QNode* rear;
}Queue;
void QueueInit(Queue* q);// 初始化队列
void QueuePush(Queue* q, QDataType data);// 队尾入队列
void QueuePop(Queue* q);// 队头出队列
QDataType QueueFront(Queue* q);// 获取队列头部元素
QDataType QueueBack(Queue* q);// 获取队列队尾元素
int QueueSize(Queue* q);// 获取队列中有效元素个数
int QueueEmpty(Queue* q);// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
void QueueDestroy(Queue* q);// 销毁队列
#include "Queue.h"
void QueueInit(Queue* q)// 初始化队列
{
q->front = q->rear = NULL;
}
void QueuePush(Queue* q, QDataType data)//入队列
{
QNode* newQNode = (QNode*)malloc(sizeof(QNode));//扩容,防止空间不够
if (newQNode == NULL)
{
perror("malloc fail");
exit(-1);
}
newQNode->data = data;
newQNode->next = NULL;
if (q->rear == NULL)//用来判断一个队列里是否有没有元素
{
q->front = q->rear = newQNode;
}
else
{
q->rear->next = newQNode;
q->rear = newQNode;
}
}
void QueuePop(Queue* q)//出队列
{
if (q->front == NULL)
{
printf("front is isfull");
exit(-1);
}
printf("Pop->%d ", q->front->data);
QNode* next = q->front->next;
free(q->front);
q->front = next;
}
QDataType QueueFront(Queue* q)//访问队列头元素
{
return q->front->data;
}
QDataType QueueBack(Queue* q)//访问队列尾元素
{
return q->rear->data;
}
int QueueSize(Queue* q) // 获取队列中有效元素个数
{
int i = 0;
QNode* count = q->front;
while (count)
{
count = count->next;
++i;
}
return i;
}
int QueueEmpty(Queue* q)// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
{
return q->front == NULL;
}
void QueueDestroy(Queue* q)// 销毁队列
{
QNode* next = q->front;
QNode* cur = NULL;
while (next)
{
cur = next->next;
free(next);
next = cur;
}
q->front = q->rear = NULL;
}
#include"Queue.h"
#include<stdbool.h>
typedef struct {
Queue q1;
Queue q2;
} MyStack;
MyStack* myStackCreate();//初始化
void myStackPush(MyStack* obj, int x);//入栈
int myStackPop(MyStack* obj);//出栈
int myStackTop(MyStack* obj);//访问栈顶元素
bool myStackEmpty(MyStack* obj);//检查队列是否为空
void myStackFree(MyStack* obj);//销毁队列
#include"QueueImplementationStack.h"
MyStack* myStackCreate() //初始化用来实现栈功能的两个队列
{
MyStack* pry = (MyStack*)malloc(sizeof(MyStack));
QueueInit(&pry->q1);
QueueInit(&pry->q2);
return pry;
}
void myStackPush(MyStack* obj, int x) //入栈操作,哪个不为空入哪个
{
if (!QueueEmpty(&obj->q1))
{
QueuePush(&obj->q1, x);
}
else
{
QueuePush(&obj->q2, x);
}
}
int myStackPop(MyStack* obj)
//出栈操作,把一个队列的元素留一个,其余的全部转义至另一个队列,留下的那一个元素就是最后进入栈的元素
{
Queue* empty = &obj->q1;
Queue* noempty = &obj->q2;
if (!QueueEmpty(&obj->q1))
{
noempty = &obj->q1;
empty = &obj->q2;
}
while (QueueSize(noempty) > 1)
{
QueuePush(empty, QueueFront(noempty));
QueuePop(noempty);
}
int top = QueueFront(noempty);
QueuePop(noempty);
return top;
}
int myStackTop(MyStack* obj) //访问栈顶元素
{
if (!QueueEmpty(&obj->q1))
{
return QueueBack(&obj->q1);
}
else
{
return QueueBack(&obj->q2);
}
}
bool myStackEmpty(MyStack* obj) //判断栈是否为空
{
//判断栈是否为空的条件就是,负责出栈功能和入栈功能的两个队列都要是空的才可以。
return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}
void myStackFree(MyStack* obj) //销毁用来实现栈的两个队列
{
QueueDestroy(&obj->q1);
QueueDestroy(&obj->q2);
free(obj);
}
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法