【資料結構】棧與佇列的面試題(二)
阿新 • • 發佈:2019-02-14
一.使用兩個佇列實現(實現棧先進後出的特點) 思路: 1.建立兩個佇列的結構體,並將這倆個佇列(Queue1和Queue2)的結構體封裝到一個結構體裡。 2.入棧:判斷哪個佇列中為空(Queue1和Queue2)就入哪個佇列。 3.出棧:判斷任意一個佇列(Queue1和Queue2)中如果Queue1或者Queue2中的元素個數大於一則把這個佇列中的元素匯入另外一個佇列中(相當於取元素不為一的佇列的隊頭(Front)元素插入(Push)另外一個佇列)直到不為一的元素的佇列只剩一個元素然後出佇列(Pop),再將令外一個佇列的元素匯入為空的佇列,直到該佇列剩一個元素,然後輸出。如此迴圈 。直到兩個佇列為空。圖解:實現的程式碼:
2.再新增一個棧,每次棧不為空並且用棧頂的元素和陣列Outorder中索引OutIdx所指向的元素做對比如果相同則取棧頂元素並且出棧(Pop),索引(OutIdx++),如果相比元素不同則將陣列Inorder中的元素入棧,索引InIdx++(一定要防止越界)如此迴圈就可以判斷。圖解:程式碼部分:
將陣列中的奇數下標入Stack2,r然後(Top2 += 2)圖解:程式碼:SharedStack.h
二:元素出棧,入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)思路: 1.將入棧序列放入陣列Inorder中,再定義一個索引(InIdx)。將出棧序列放在陣列Outorder中,再定義一個索引(OutIdx)//入棧 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); } }
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.cvoid 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;
}