栈和队列面试题
1、实现一个栈,要求实现push(出栈),poop(入栈),Min(返回最小值)的时间复杂度位O(1)
方式1:给定两个栈,一个栈保存数据,一个栈保存最小值。取一个数据,压入数据栈中,同时向最小值栈中存入一个数据。取下一个数据,若是下一个数据小于最小值栈中的栈顶数据,则将该数据插入数据栈同时压入最小值栈中;否则压入数据栈中。
1、实现一个栈,要求实现push(出栈),poop(入栈),Min(返回最小值)的时间复杂度位O(1)
方式1:给定两个栈,一个栈保存数据,一个栈保存最小值。取一个数据,压入数据栈中,同时向最小值栈中存入一个数据。取下一个数据,若是下一个数据小于最小值栈中的栈顶数据,则将该数据插入数据栈同时压入最小值栈中;否则压入数据栈中。
方式2:用一个栈实现:
(1)、压栈的时候,将一个相同的数据进栈两次,上面的那个数据表示数据,下面的元素表示最小值;继续压入下一个数据,并且用该元素与最小值进行比较:将该元素和当前最小值入栈,继续压入下面的元素……
实现代码:
# pragma once # include"satck.h" # include<assert.h> //给出最小栈的操作 typedef struct MinStack { Stack s;//用栈实现 }MinStack; void MStackInit(MinStack *ms) { assert(ms); StackInit(&ms->s); } //获取最小值 MSDataType GetMinData(MinStack *ms) { return StackTop(&ms->s)._mindata; } void MStackPush(MinStack *ms, MSDataType data) { //给出元素 SElem elem;; elem._data = elem._mindata = data; if (!Stackempty(&ms->s))//栈里面有元素 { MSDataType minData = GetMinData(ms);//获取最小值 //如果最小值小于data,更新最小值中的data if (minData < data) elem._mindata = data; } StackPush(&ms->s,elem); } int MSEmpty(MinStack *ms) { assert(ms); return Stackempty(&ms->s); } void MStackPop(MinStack *ms) { assert(ms); assert(!Stackempty(ms)); StackPop(&ms->s); } //获取最小元素 MSDataType MStackTop(MinStack *ms) { return StackTop(&ms->s)._data; } int MStackSize(MinStack *ms) { return StackSize(&ms->s); } void TestMinStack() { MinStack s; MStackInit(&s); MStackPush(&s, 2); MStackPush(&s, 3); MStackPush(&s, 4); MStackPush(&s, 7); MStackPush(&s, 5); printf("size=%d\n", MStackSize(&s)); printf("top=%d\n", MStackTop(&s)); printf("min=%d\n", MStackMinData(&s)); MStackPop(&s); MStackPop(&s); printf("size=%d\n", MStackSize(&s)); printf("top=%d\n", MStackTop(&s)); printf("min=%d\n", MStackMinData(&s)); }
stack.h
# pragma oncee # include<stdio.h> # include<stdlib.h> # include<string.h> # include<assert.h> #define MAX_SIZE 10 //栈里面放的元素 typedef int MSDataType; typedef struct SElem { MSDataType _data;//数据 MSDataType _mindata;//最小值 }SElem; typedef SElem DataTYpe; typedef struct Stack { DataTYpe _array[MAX_SIZE];//有效元素的个数 int _top; //栈顶元素的位置 }Stack; //初始化 void StackInit(Stack *s); //入栈 void StackPush(Stack *s, DataTYpe data); //出栈 void StackPop(Stack *s); //取栈顶元素 DataTYpe StackTop(Stack *s); //有效元素的个数 int StackSize(Stack *s); //检测栈是否为空 int Stackempty(Stack *s);
2、使用两个栈实现一个队列
3、