c mvc网站做404,有限责任公司如何承担债务,磁器口网站建设,农业电商网站有哪些题目详情#xff1a; 思路#xff1a;1.定义两个队列用于存储栈的数据#xff0c;其中一个为空。 2.对我们定义的栈进行入数据#xff0c;就相当于对不为空的队列进行入数据。 3.对我们定义的栈进行删除#xff0c;相当于取出不为空的队列中的数据放到为空的队列中#x…题目详情 思路1.定义两个队列用于存储栈的数据其中一个为空。 2.对我们定义的栈进行入数据就相当于对不为空的队列进行入数据。 3.对我们定义的栈进行删除相当于取出不为空的队列中的数据放到为空的队列中直到此时只剩下一个数据对剩下的数据进行取出后删除。也就相当于对当前的栈进行删除。对于栈的顶删相当于对队列的尾删 3.返回栈的顶部元素 4.销毁栈 注意用c语言实现队列没法直接引用这里需要自己创建一个队列再完成上述操作。如果还不会队列的小伙伴可以看看我的这篇博客数据结构--队列【详解】~(˶‾᷄ꈊ‾᷅˵)~-CSDN博客 队列的实现 typedef int QDataType;
typedef struct QueueNode
{//队列的定义与声明struct QueueNode* next;QDataType data;
}QNode;
//创建一个结构体用于存储队列头尾指针
typedef struct Queue
{QNode* head;QNode* tail;
}Queue;
//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq-head pq-tail NULL;
}
//摧毁队列
void QueueDestory(Queue* pq)
{assert(pq);QNode* cur pq-head;while (cur){//存储下一个节点的指针防止找不到和野指针的出现QNode* next cur-next;free(cur);cur next;}pq-head pq-tail NULL;
}// 队尾入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//为队列开辟一个新节点QNode* newnode (QNode*)malloc(sizeof(QNode));if (newnode NULL){printf(malloc fail\n);exit(-1);}newnode-data x;newnode-next NULL;
//若第一个节点为空则head和tail指向第一个节点if (pq-tail NULL){pq-head pq-tail newnode;}//如果不是空就让尾指针指向新节点并移动尾指针方便下一次插入else{pq-tail-next newnode;pq-tail newnode;}
}// 队头出
void QueuePop(Queue* pq)
{assert(pq);assert(pq-head);// 1、一个直接释放第一个节点的内存// 2、多个要记得保存第一个节点的下一个节点的位置防止找不到if (pq-head-next NULL){free(pq-head);pq-head pq-tail NULL;}else{QNode* next pq-head-next;free(pq-head);pq-head next;}
}//返回队头节点的数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq-head);return pq-head-data;
}
//返回队尾节点的数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq-head);return pq-tail-data;
}
//返回队列的大小
int QueueSize(Queue* pq)
{assert(pq);int size 0;//这里用cur记录节点的个数QNode* cur pq-head;while (cur){size;cur cur-next;}return size;
}
//判断节点是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq-head NULL;
} 用队列实现栈的函数实现 //定义一个结构体用于存放两个队列
typedef struct {Queue q1;Queue q2;
} MyStack;
//用队列创造栈
MyStack* myStackCreate() {//用ps开辟空间作为栈存储数据MyStack* ps(MyStack*)malloc(sizeof(MyStack));if(psNULL){printf(malloc fail\n);exit(-1);}QueueInit(ps-q1);QueueInit(ps-q2);return ps;
}
//用队列入栈
void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(obj-q1))//选择不为空的那个队列入{QueuePush(obj-q1,x);}else{QueuePush(obj-q2,x);}
}
//用队列进行出栈操作
int myStackPop(MyStack* obj) {Queue* emptyQobj-q1;//将不为空的队列的数据转移到为空的队列直到只剩一个Queue* nonemptyQobj-q2;if(!QueueEmpty(obj-q1)){emptyQobj-q2;nonemptyQobj-q1;}while(QueueSize(nonemptyQ)1){QueuePush(emptyQ,QueueFront(nonemptyQ));QueuePop(nonemptyQ);}int topQueueFront(nonemptyQ);QueuePop(nonemptyQ);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) {QueueDestory(obj-q1);QueueDestory(obj-q2);free(obj);
}注意摧毁栈时要先摧毁obj下所对应的队列再进行free(obj)。如果先free(obj),就无法找到对应的队列了 完整代码 typedef int QDataType;
typedef struct QueueNode
{//队列的定义与声明struct QueueNode* next;QDataType data;
}QNode;
//创建一个结构体用于存储队列头尾指针
typedef struct Queue
{QNode* head;QNode* tail;
}Queue;
//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq-head pq-tail NULL;
}
//摧毁队列
void QueueDestory(Queue* pq)
{assert(pq);QNode* cur pq-head;while (cur){//存储下一个节点的指针防止找不到和野指针的出现QNode* next cur-next;free(cur);cur next;}pq-head pq-tail NULL;
}// 队尾入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//为队列开辟一个新节点QNode* newnode (QNode*)malloc(sizeof(QNode));if (newnode NULL){printf(malloc fail\n);exit(-1);}newnode-data x;newnode-next NULL;
//若第一个节点为空则head和tail指向第一个节点if (pq-tail NULL){pq-head pq-tail newnode;}//如果不是空就让尾指针指向新节点并移动尾指针方便下一次插入else{pq-tail-next newnode;pq-tail newnode;}
}// 队头出
void QueuePop(Queue* pq)
{assert(pq);assert(pq-head);// 1、一个直接释放第一个节点的内存// 2、多个要记得保存第一个节点的下一个节点的位置防止找不到if (pq-head-next NULL){free(pq-head);pq-head pq-tail NULL;}else{QNode* next pq-head-next;free(pq-head);pq-head next;}
}//返回队头节点的数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq-head);return pq-head-data;
}
//返回队尾节点的数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq-head);return pq-tail-data;
}
//返回队列的大小
int QueueSize(Queue* pq)
{assert(pq);int size 0;//这里用cur记录节点的个数QNode* cur pq-head;while (cur){size;cur cur-next;}return size;
}
//判断节点是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq-head NULL;
}
//定义一个结构体用于存放两个队列
typedef struct {Queue q1;Queue q2;
} MyStack;
//用队列创造栈
MyStack* myStackCreate() {//用ps开辟空间作为栈存储数据MyStack* ps(MyStack*)malloc(sizeof(MyStack));if(psNULL){printf(malloc fail\n);exit(-1);}QueueInit(ps-q1);QueueInit(ps-q2);return ps;
}
//用队列入栈
void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(obj-q1))//选择不为空的那个队列入{QueuePush(obj-q1,x);}else{QueuePush(obj-q2,x);}
}
//用队列进行出栈操作
int myStackPop(MyStack* obj) {Queue* emptyQobj-q1;//将不为空的队列的数据转移到为空的队列直到只剩一个Queue* nonemptyQobj-q2;if(!QueueEmpty(obj-q1)){emptyQobj-q2;nonemptyQobj-q1;}while(QueueSize(nonemptyQ)1){QueuePush(emptyQ,QueueFront(nonemptyQ));QueuePop(nonemptyQ);}int topQueueFront(nonemptyQ);QueuePop(nonemptyQ);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) {QueueDestory(obj-q1);QueueDestory(obj-q2);free(obj);
}博客到这里也是结束了喜欢的小伙伴可以点赞加关注支持下博主这对我真的很重要~~