上次学会了栈和队列的基本算法。今天我就来进行一些面试题的练习,巩固一下所学的知识。
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");
}
以上就是我所练习的面试题,里面有可能有很多错误,而且也有很多地方有不足,希望大家参观参观即可。