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;
}