1. 程式人生 > >【資料結構】棧與佇列的面試題(二)

【資料結構】棧與佇列的面試題(二)

一.使用兩個佇列實現(實現棧先進後出的特點)     思路:              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;
}