有关栈和队列的面试题

上次学会了栈和队列的基本算法。今天我就来进行一些面试题的练习,巩固一下所学的知识。

1.使用两个栈实现一个队列。

typedef struct SQueue {
	Stack	stack1;	// 入数据的
	Stack	stack2; // 出数据的
}	SQueue;

void Init(SQueue *pSQ)    //初始化。
{
	Stack *p1, *p2;
	p1 = &(pSQ->stack1);
	p2 = &(pSQ->stack2);

	StackInit(p1);
	StackInit(p2);
}

void Push(SQueue *pSQ, SDataType data)   //入栈
{
	Stack *p1, *p2;
	p1 = &(pSQ->stack1);
	p2 = &(pSQ->stack2);

	StackPush(p1, data);
}

void Pop(SQueue *pSQ)        //出栈
{
	Stack *p1, *p2;
	p1 = &(pSQ->stack1);
	p2 = &(pSQ->stack2);
	SDataType data;

	if (StackIsEmpty(p2)) {
		while (!StackIsEmpty(p1)) {
			data = StackTop(p1);
			StackPop(p1);
			StackPush(p2, data);
		}
	}

	StackPop(p2);
}


SDataType Front(SQueue *pSQ)
{
	Stack *p1, *p2;
	p1 = &(pSQ->stack1);
	p2 = &(pSQ->stack2);
	SDataType data;

	if (StackIsEmpty(p2)) {
		while (!StackIsEmpty(p1)) {
			data = StackTop(p1);
			StackPop(p1);
			StackPush(p2, data);
		}
	}

	return StackTop(p2);
}

2.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为 (4,5,3,2,1) 。

int InOrder(char in[],char out[],int size1,int size2)       //检验出栈合法的函数。
{
	int ii=0;
	int io=0;
	Stack stack;                                            //定义一个栈,并初始化。
	StackInit(&stack);
	if(size1!=size2)                                        //如果两个in和out栈的长度都不同,那肯定不合法。
	{
		return false;
	}
	while(ii<size1)                                         //循环将in的数据入栈。
	{
		StackPush(&stack,in[ii]);
		if(in[ii]!=out[io])                                 //当in与out的数据不同时,in像后移一位。
		{
			ii++;
		}
		else if(in[ii]==out[io])                            //否则出栈in,并且设ii为栈顶元素。io++.
		{
			StackPop(&stack);
			ii=StackTop(&stack);
			io++;
		}
	}
	if(StackTop(&stack)==0)                                 //循环结束后,如果栈顶为空,证明出栈合法,否则不合法。
	{
		return true;
	}
	return false;
}

3.一个数组实现两个栈(共享栈)。

#define MAX 10
typedef int DataType;
typedef struct StackArray{
	DataType *array;
	int capality;
	int top1;
	int top2;
} StackArray;

void StackShare(StackArray *p,DataType x[])
{
	int i=0;
	p->array=(DataType *)malloc(sizeof(DataType)*MAX);      //申请空间。
	p->top1=0;
	p->top2=MAX-1;                                          //将两个栈的栈顶分别定位两头。
	while(p->top1<=p->top2){                                //入栈。
		p->array[p->top1]=x[i];
		p->array[p->top2]=x[i+1];
		i+=2;
		p->top1++;
		p->top2--;
	}
	printf("It is full\n");                                 //此时两个栈满了。注:此处可以添加扩容。
	while(p->top1==0){                                      //出栈直到为空栈。
		p->top1--;
	    p->top1++;
	}
	printf("It is empty\n");
}



以上就是我所练习的面试题,里面有可能有很多错误,而且也有很多地方有不足,希望大家参观参观即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值