两个栈实现一个队,两个队实现一个栈

1,用两个栈实现一个队列
在这里插入图片描述

头文件

#pragma once
#include"lstack.h"
typedef struct Ptstsatck
{
	Lstack* s1;
	Lstack* s2;
}Psts,*Qpsts;
//初始化 
void my_Init(Psts*psplist);
//移动函数(将栈1内容移至栈2)
void Move(Lstack* p1, Lstack* p2);
// 入队
bool my_Push(Psts*psplist, Elemtype val);
//出队 (出对操作成功还要返回队头值)
bool my_Pop(Psts*psplist,Elemtype* rval);
//获取队头元素值 
bool my_Top(Psts* psplist,Elemtype* rval);
// 获取有效值个数
int my_Get_length(Psts*plist);
//判空
bool my_Is_empty(Psts* plist);
//清空
bool my_Clear(Psts* plist);
//销毁
bool my_Destroy(Psts* plist);
//打印
void my_Show(Psts* plist);

函数文件

#include"twostack-to-queue.h"
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
//初始化 
void my_Init(Psts* plist)
{
	assert(plist!=nullptr);
	plist->s1 = Buynode();
	plist->s2 = Buynode();
	Init(plist->s1);
	Init(plist->s2);
}
//移动函数(将栈1内容移至栈2)
void Move(Lstack* p1, Lstack* p2)
{
	assert(p1 != nullptr && p2 != nullptr);
	int length = Get_length(p1);
	for (int i = 0; i < length; i++)
	{
		int p = 0;
		Pop(p1, &p);
		Push(p2, p);
	}
}
// 入队
bool my_Push(Psts* plist, Elemtype val)
{
	assert(plist!=nullptr);
	return Push(plist->s1, val);
}
//出队 (出对操作成功还要返回队头值)
bool my_Pop(Psts* plist, Elemtype* rval)
{
	assert(plist != nullptr);
	if (Is_empty(plist->s2))
	{
		Move(plist->s1, plist->s2);
	}
	return Pop(plist->s2, rval);
 }
//获取队顶元素
bool my_Top(Psts* plist, Elemtype* rval)
{
	assert(plist!=nullptr);
	if (Is_empty(plist->s2))
	{
		Move(plist->s1, plist->s2);
	}
	return Top(plist->s2, rval);
}

// 获取有效值个数
int my_Get_length(Psts* plist)
{
	assert(plist != nullptr);
	printf("s1里的个数%d\n", Get_length(plist->s1));
	printf("s1里的个数%d\n", Get_length(plist->s2));
	printf("总共的个数是:");
	return (Get_length(plist->s1) + Get_length(plist->s2));
}
//判空
bool my_Is_empty(Psts* plist)
{
	assert(plist!=nullptr);
	return (Get_length(plist->s1) + Get_length(plist->s2))==0;
}
//清空
bool my_Clear(Psts* plist)
{
	assert(plist != nullptr);
	Clear(plist->s1);
	Clear(plist->s2);
	return true;
}
//销毁
bool my_Destroy(Psts* plist)
{
	assert(plist != nullptr);
	Destroy(plist->s1);
	Destroy(plist->s2);
	return true;
}
//打印
void my_Show(Psts* plist)
{
	assert(plist != nullptr);
	if (Is_empty(plist->s2))
	{ 
		Move(plist->s1, plist->s2);
		
	}
	Show(plist->s2);
    if (!Is_empty(plist->s1))
	{
			Move(plist->s1, plist->s2);
            Show(plist->s2);
	}
}
int main()
{
	Psts ps;
	my_Init(&ps);
	for (int i = 0; i < 7; i++)
	{
		my_Push(&ps, i + 1);
	}
	my_Show(&ps);
	printf("%d\n",my_Get_length(&ps));
	int val = 0;
	my_Top(&ps,&val);
	printf("%d\n",val);
	my_Pop(&ps, &val);
	printf("%d\n",val);
	my_Show(&ps);
	printf("%d\n", my_Get_length(&ps));
	return 0;
}

2,用两个链式队列实现一个栈
在这里插入图片描述

头文件

#pragma once
#include"Lqueue.h"
typedef struct TQTstack
{
	Linklist* s1;
	Linklist* s2;
}Tqt,*Ptqt;
//初始化 
void my_Init(Tqt* plist);
//移动函数(将队p内容移至队p2)
void Move(Linklist* p1, Linklist* p2);
// 入队
bool my_Push(Tqt* psplist, Elemtype val);
//出队 (出对操作成功还要返回队头值)
bool my_Pop(Tqt* plist, Elemtype* rval);
//获取队头元素值 
bool my_Top(Tqt* plist, Elemtype* rval);
// 获取有效值个数
int my_Get_length(Tqt* plist);
//判空
bool my_Is_empty(Tqt* plist);
//清空
bool my_Clear(Tqt* plist);
//销毁
bool my_Destroy(Tqt* plist);
//打印
void my_Show(Tqt* plist);

函数文件

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"two Lqueue-to-stack.h"
//初始化
void my_Init(Tqt* plist)
{
	assert(plist != nullptr);
	plist->s1 = (Linklist*)malloc(sizeof(Linklist));
	plist->s2 =(Linklist*)malloc(sizeof(Linklist));
	Init(plist->s1);
	Init(plist->s2);
}
//移动函数(将队p1内容移至队p2)
void Move(Linklist* p1, Linklist* p2)
{
	assert((p1!=nullptr)&&(p2!=nullptr));
	int length = Get_length(p1);
	for(int i=0;i<length-1;i++)
	{
		 int val=0;
		 Pop(p1, &val);
		 Push(p2,val);
	}
}
// 入队
bool my_Push(Tqt* plist, Elemtype val)
{
	assert(plist != nullptr);
	if (Is_empty(plist->s2))
	{
		 Push(plist->s1,val);
	}
	else
	{
		 Push(plist->s2, val);
	}
	return true;
}
//出队 (出对操作成功还要返回队头值)
bool my_Pop(Tqt* plist, Elemtype* rval)
{
	assert(plist != nullptr && rval != nullptr);
	if (my_Is_empty(plist)) return false;
	if (Is_empty(plist->s1))
	{
		Move(plist->s2,plist->s1);
	    Pop(plist->s2, rval);
		return true;
	}
	if (Is_empty(plist->s2))
	{
		Move(plist->s1, plist->s2);
		Pop(plist->s1, rval); 
		return true;
	}
}
//获取队头元素值 
bool my_Top(Tqt* plist, Elemtype* rval)
{
	assert(plist != nullptr&&rval!=nullptr);
	if (my_Is_empty(plist)) return false;
	if (Is_empty(plist->s1))
	{
		Move(plist->s2, plist->s1);
	   Top(plist->s2, rval);
	   Push(plist->s1,*rval);
	   Pop(plist->s2,rval);
		return true;
	}
	else if (Is_empty(plist->s2))
	{
		Move(plist->s1, plist->s2);
		Top(plist->s1,rval);
		Push(plist->s2,*rval);
		Pop(plist->s1, rval); 
		 return true;
	}
	return true;
}
// 获取有效值个数
int my_Get_length(Tqt* plist)
{
	assert(plist != nullptr);
	printf("有效值的个数为:");
	return (Get_length(plist->s1) + Get_length(plist->s2));
}
//判空
bool my_Is_empty(Tqt* plist)
{
	assert(plist != nullptr);
	return Get_length(plist->s1) + Get_length(plist->s2)==0;
}
//清空
bool my_Clear(Tqt* plist)
{
	assert(plist!=nullptr);
	if (!Is_empty(plist->s1)) 
	{
		return Clear(plist->s1);
	}
	else{return Clear(plist->s2);}
}
//销毁
bool my_Destroy(Tqt* plist)
{
	assert(plist != nullptr);
	Destroy1(plist->s1);
	Destroy1(plist->s2);
	return true;
}
//打印
void my_Show(Tqt* plist)
{
	assert(plist != nullptr);
	if (!Is_empty(plist->s1))
	{
		printf("打印\n");
		Show(plist->s1); 
	}
	else if(plist->s2!=nullptr)
	{
		printf("打印\n");
		Show(plist->s2);
	}
}
int main()
{
	Tqt t;
	my_Init(&t);
	for (int i = 0; i < 8; i++)
	{
		my_Push(&t,i+1);
	}
	my_Show(&t);
	printf("%d\n", my_Get_length(&t));
	int val = 0;
	my_Pop(&t, &val);
	printf("%d\n",val);
	printf("%d\n", my_Get_length(&t));
	my_Top(&t,&val);
	printf("%d\n",val);
	printf("%d\n", my_Get_length(&t));
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值