数据结构之栈和队列

前言:栈和队列是非常有用的结构,一个后进先出,一个先进先出。它们也有很多的应用,such as数制的转换、表达式求值、舞伴问题、迷宫求解、括号的匹配。

这里给出数制的转换(十进制转换为其它进制,当然,其它进制转换也只可先转换为10进制,在进行相应转换,都可以用到栈),舞伴问题(简单的队列的使用),迷宫求解的话用到了回溯法和栈,其它博主写得要好很多,可以去看看。

1.数制的转换

/*功能:数制的转换*/
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 100

typedef struct{
	int *top;
	int *base;
	int stacksize;
}SqStack;

void InitSqStack(SqStack &S)
{
	S.base = new int[MAXSIZE];
	if(!S.base) exit(0);
	S.top = S.base;
	S.stacksize = MAXSIZE;
}

void Push(SqStack &S,int e)
{
	if(S.top-S.base == S.stacksize)
		exit(0);
	*S.top = e;
	*S.top++;
}

int Pop(SqStack &S)
{
	if(S.top == S.base)
		exit(0);
	 *S.top--;
	 return *S.top;
}

void conversion(SqStack &S,int N,int P)
{
	static Q = N;
	while(N)
	{
		Push(S,N%P);
		N = N/P;
	}
	cout<<Q<<"的"<<P<<"进制数为:"<<endl;
	while(S.top!=S.base)
	{
		cout<<Pop(S)<<" ";
	}
}

int main()
{
	SqStack S;
	InitSqStack(S);
	int N,P;
	cout<<"请输入要转换的整数:"<<endl;
	cin>>N;
	cout<<"请输入要转的进制数:"<<endl;
	cin>>P;
	conversion(S,N,P);
	return 0;
}
	

2.舞伴问题

#include<iostream>
#include<stdlib.h>
using namespace std;
#define MAXQSIZE 100

typedef struct{
	char name[20];
	char sex;
}P;

typedef struct{
	P *base;
	int font;
	int rear;
}SqQueue;
SqQueue M,F;

void InitQueue(SqQueue &Q)
{
	Q.base = new P[MAXQSIZE];
	if(!Q.base) exit(0);
	Q.font = Q.rear=0;
}

int QueuLength(SqQueue Q)
{
	return((Q.rear-Q.font+MAXQSIZE)%MAXQSIZE);
}

void EnQueue(SqQueue &Q,P e)
{
	if((Q.rear+1)%MAXQSIZE==Q.font)
		exit(0);
	Q.base[Q.rear]=e;
	Q.rear = (Q.rear+1)%MAXQSIZE;
}

void DeQueue(SqQueue &Q)
{
	if(Q.font==Q.rear) exit(0);
	Q.font=(Q.font+1)%MAXQSIZE;
}


void DancePartner(P dancer[],int num,SqQueue &M,SqQueue &F)
{
	for(int i=0;i<num;i++)
	{
		cout<<"name :"<<endl;
		cin>>dancer[i].name;
		cout<<"sex:"<<endl;
		cin>>dancer[i].sex;
		if(dancer[i].sex=='F') EnQueue(F,dancer[i]);
		else EnQueue(M,dancer[i]);
	}
	cout<<"The dancing partners are:\n";
	while((M.font!=M.rear)&&(F.font!=F.rear))
	{
		cout<<F.base[F.font].name<<" & ";
		DeQueue(F);
		cout<<M.base[M.font].name<<endl;
		DeQueue(M);
	}
	cout<<endl;
	if(F.font!=F.rear)
	{
	cout<<"The first woman to get a partner is: "<<F.base[F.font].name<<endl;
	}
	else if(M.font!=M.rear)
	{
		cout<<"The first man to get a partner is: "<<M.base[M.font].name<<endl;
	}
}

int main()
{
	int num;
	cout<<"要录入的人数:"<<endl;
	cin>>num;
	P dancer[100];
	SqQueue M,F;
	InitQueue(M);
	InitQueue(F);
	DancePartner(dancer,num,M,F);
	return 0;
}
后记:有更好的结构表达可以交流哦,下期预告:串的模式匹配算法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

threecat.up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值