一.使用两个队列实现(实现栈先进后出的特点)
思路:
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; }