栈与队列的面试题(二)

一.使用两个队列实现(实现栈先进后出的特点)
     思路:
              1.创建两个队列的结构体,并将这俩个队列(Queue1和Queue2)的结构体封装到一个结构体里。

                       2.入栈:判断哪个队列中为空(Queue1和Queue2)就入哪个队列。
        3.出栈:判断任意一个队列(Queue1和Queue2)中如果Queue1或者Queue2中的元素个数大于一则把这个队列中的元素导入另外一个队列中(相当于取元素不为一的队列的队头(Front)元素插入(Push)另外一个队列)直到不为一的元素的队列只剩一个元素然后出队列(Pop),再将令外一个队列的元素导入为空的队列,直到该队列剩一个元素,然后输出。如此循环。直到两个队列为空。


图解:

队列操作参考:点击打开链接
实现的代码:

//入栈
void StackPush(Stack* s, DataType data)
{
	assert(s);
	
	//哪个队列为空入哪个队列
	if (QueueEmpty(&(s->q1)))
		QueuePush(&(s->q2), data);
	else
		QueuePush(&(s->q1), data);

}


//出栈
void StackPop(Stack* s,Queue* q)
{
	assert(s);

	if (QueueEmpty(&(s->q1)) && QueueEmpty(&(s->q2)))
	{
		printf("栈已空!!!!\n");
		return;
	}

		if (!QueueEmpty(&(s->q1)))
		{
			while (QueueSize(&s->q1) > 1)
			{
				DataType data = QueueTop(&(s->q1));
				QueuePop(&(s->q1));
            
				QueuePush(&(s->q2), data);
			}

			QueuePop(&s->q1);
		}
		if (!QueueEmpty(&(s->q2)))
		{

			while (QueueSize(&s->q1) > 1)
			{

				DataType data = QueueTop(&(s->q2));
				QueuePop(&(s->q2));
				QueuePush(&(s->q2), data);

			}
			QueuePop(&s->q2);
		}

}

二:元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)
思路:
          1.将入栈序列放入数组Inorder中,再定义一个索引(InIdx)。将出栈序列放在数组Outorder中,再定义一个索引(OutIdx)

              2.再添加一个栈,每次栈不为空并且用栈顶的元素和数组Outorder中索引OutIdx所指向的元素做对比如果相同则取栈顶元素并且出栈(Pop),索引(OutIdx++),如果相比元素不同则将数组Inorder中的元素入栈,索引InIdx++(一定要防止越界)
如此循环就可以判断。

图解:

栈的操作参考:点击打开链接


代码部分:

int InOutStackIsValid(int* InOrder, int InSize, int* OutOrder, int OutSize)
{

	Stack s;
	int InIdx = 0;
	int OutIdx = 0;

	// 入栈和出栈元素的个数必须相同
	if (InSize != OutSize)
		return 0;


	StackInit(&s);

	while (OutIdx < OutSize)
	{
		//栈顶元素与Outorder中的第一个元素不同就入栈
		while (StackEmpty(&s) || StackTop(&s) != OutOrder[OutIdx])
		{
			//防止越界
			if (InIdx < InSize)
				StackPush(&s, InOrder[InIdx++]);
			else
				return 0;
		}

        //栈顶元素和Outorder的第一个元素相同就出栈
		StackPop(&s);

		OutIdx++;
	}

	return 1;
}

void TestCheckStack()
{
	int InOrder[] = { 1, 2, 3, 4, 5 };
	int InSize = sizeof(InOrder) / sizeof(InOrder[0]);
	int OutOrder[] = { 4, 5, 3, 2, 1 };
	int OutSize = sizeof(OutOrder) / sizeof(OutOrder[0]);

	if (InOutStackIsValid(InOrder, InSize, OutOrder, OutSize))
	{

		printf("输出合法!!\n");

	}
	else
	{
		printf("输出不合法!!!\n");
	}
}

int main()
{
	
	TestSharedStack();
	system("pause");
	return 0;
}

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

      思路:
              定义一个数组,再将指针(Top1)指向数组下标的0号位,将指针(Top2)指向数组下标的1号位
              将数组中的偶数下标入Stack1,然后(Top1+= 2)

                     将数组中的奇数下标入Stack2,r然后(Top2 += 2)

图解:

代码:
SharedStack.h
#pragma once
#include<string.h>
#include<stdio.h>
#include<Windows.h>
#include<assert.h>

typedef int DataType;
#define MAX_SIZE 10

typedef struct SharedStack
{
	DataType array[MAX_SIZE];
	int top1;             //栈1占用偶数空间  
	int top2;            //栈2占用奇数空间


}SharedStack;


//初始化
void SharedStackInit(SharedStack* s);

//判空
int SharedStackEmpty(SharedStack* s,int which);

//栈顶元素
DataType SharedStackTop(SharedStack* s, int which);

//入栈
void SharedStackPush(SharedStack* s,int which, DataType data);

//出栈
void SharedStackPop(SharedStack* s, int which);

//栈中元素个数
int SharedStackSize(SharedStack* s, int which);

SharedStack.c

//初始化
void SharedStackInit(SharedStack* s)
{
	s->top1 = 0;          //栈1占用偶数空间   
	 
	s->top2 = 1;          //栈2占用奇数空间

}


//入栈
void SharedStackPush(SharedStack* s,int which, DataType data)
{
	assert(1 == which || 2 == which);

	if (1 == which)
	{
		if (s->top1 < MAX_SIZE)
		{
			s->array[s->top1] = data;
			s->top1 += 2;
		}

	}
	else
	if (s->top2 < MAX_SIZE)
	{
		s->array[s->top2] = data;
		s->top2 += 2;
	}

}

//出栈
void SharedStackPop(SharedStack* s,int which)
{
	assert(1 == which || 2 == which);

	if (1 == which)
	{
		if (s->top1 != 0)
			s->top1 -= 2;

	}
	else
	{
		if (s->top2 != 0)
			s->top2 -= 2;
	}
}

//判断栈是不为空
int SharedStackEmpty(SharedStack* s,int which)
{

	assert(1 == which || 2 == which);
	if (1 == which)
	{
		if (s->top1 == 0)
			return 0;
		else
			return 1;
	}
	else
	{
		if (s->top2 == 0)
			return 3;
		else
			return 4;
	}


}

//获取栈顶元素
DataType SharedStackTop(SharedStack* s, int which)
{

	assert(1 == which || 2 == which);
	if (which == 1)
	{
		if (s->top1 != 0)
			return s->array[s->top1 - 2];

	}
	else
	{

		if (which != 0)
			return s->array[s->top2 - 2];
	}
}

//获取栈中元素的个数
int SharedStackSize(SharedStack* s, int which)
{
	assert(1 == which || 2 == which);
	if (1 == which)
	{
		if (s->top1 != 0)
			return (s->top1 >> 1);
	}
	else
	{
		if (s->top2 != 0)
			return(s->top2 >> 1);
	}


}

test.c

void TestSharedStack()
{
	SharedStack s;
	SharedStackInit(&s);
    SharedStackPush(&s, 1, 2);
	SharedStackPush(&s, 1, 4);
	SharedStackPush(&s, 1, 6);
	SharedStackPush(&s, 1, 8);

	SharedStackPush(&s, 2, 1);
	SharedStackPush(&s, 2, 3);
	SharedStackPush(&s, 2, 5);
	SharedStackPush(&s, 2, 7);

	printf("size1= %d\n", SharedStackSize(&s, 1));
	printf("top1= %d\n", SharedStackTop(&s, 1));
	SharedStackPop(&s, 1);
	printf("size1= %d\n", SharedStackSize(&s, 1));
	printf("top1= %d\n", SharedStackTop(&s, 1));

	printf("size2= %d\n", SharedStackSize(&s, 2));
	printf("top2= %d\n", SharedStackTop(&s, 2));
	SharedStackPop(&s, 2);
	printf("size2= %d\n", SharedStackSize(&s, 2));
	printf("top2= %d\n", SharedStackTop(&s, 2));
}
int main()
{
	
	TestSharedStack();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/alidada_blog/article/details/80394577
今日推荐