【面试题021】包含min函数的栈
MinStack.cpp:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <iostream>
#include "StackWithMin.h" #include <cstdio> using namespace std; void Test(char *testName, const StackWithMin<int> &stack, int expected) { if(testName != NULL) printf("%s begins: ", testName); if(stack.min() == expected) printf("Passed. "); else printf("Failed. "); } int main() { StackWithMin<int> stack; stack.push(3); Test("Test1", stack, 3); stack.push(4); Test("Test2", stack, 3); stack.push(2); Test("Test3", stack, 2); stack.push(3); Test("Test4", stack, 2); stack.pop(); Test("Test5", stack, 2); stack.pop(); Test("Test6", stack, 3); stack.pop(); Test("Test7", stack, 3); stack.push(0); Test("Test8", stack, 0); return 0; } |
运行结果:
Test1 begins: Passed.
Test2 begins: Passed.
Test3 begins: Passed.
Test4 begins: Passed.
Test5 begins: Passed.
Test6 begins: Passed.
Test7 begins: Passed.
Test8 begins: Passed.
StackWithMin.cpp:
1
|
#include "StackWithMin.h"
|
StackWithMin.h:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#ifndef _STACK_WITH_MIN_H_
#define _STACK_WITH_MIN_H_ #include <stack> #include <assert.h> #include <stddef.h> template <typename T> class StackWithMin { public: StackWithMin(void) {} virtual ~StackWithMin(void) {} T &top(void); const T &top(void) const; void push(const T &value); void pop(void); const T &min(void) const; bool empty() const; size_t size() const; private: std::stack<T> m_data; // 数据栈,存放栈的所有元素 std::stack<T> m_min; // 辅助栈,存放栈的最小元素 }; template <typename T> void StackWithMin<T>::push(const T &value) { // 把新元素添加到辅助栈 m_data.push(value); // 当新元素比之前的最小元素小时,把新元素插入辅助栈里; // 否则把之前的最小元素重复插入辅助栈里 if(m_min.size() == 0 || value < m_min.top()) m_min.push(value); else m_min.push(m_min.top()); } template <typename T> void StackWithMin<T>::pop() { assert(m_data.size() > 0 && m_min.size() > 0); m_data.pop(); m_min.pop(); } template <typename T> const T &StackWithMin<T>::min() const { assert(m_data.size() > 0 && m_min.size() > 0); return m_min.top(); } template <typename T> T &StackWithMin<T>::top() { return m_data.top(); } template <typename T> const T &StackWithMin<T>::top() const { return m_data.top(); } template <typename T> bool StackWithMin<T>::empty() const { return m_data.empty(); } template <typename T> size_t StackWithMin<T>::size() const { return m_data.size(); } #endif /*_STACK_WITH_MIN_H_*/ |
Makefile:
1
2 3 4 5 6 7 8 9 10 11 12 |
.PHONY:clean
CPP=g++ CFLAGS=-Wall -g BIN=test OBJS=MinStack.o StackWithMin.o LIBS= $(BIN):$(OBJS) $(CPP) $(CFLAGS) $^ -o $@ $(LIBS) %.o:%.cpp $(CPP) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(BIN) |