【1】题目
【2】思路
建立辅助栈
【3】代码
#pragma once
#ifndef MINELEMENT_H
#define MINELEMENT_H
#include<stack>
#include<vector>
#include <assert.h>
#include<iostream>
using namespace std;
//定义类模板
template<typename T>
class MinElement
{
private:
stack<T> my_stack; //存放常规值
stack<T> min_stack; //存放与之对应的最小值
stack<T> show_stack;
public:
MinElement()
{
}
~MinElement()
{
}
void Push(const T & value)
{
my_stack.push(value);
if (min_stack.size()==0||value<min_stack.top())
{
//如果压入的元素小于栈顶元素或为0,则压入辅助栈
min_stack.push(value);
}
else
{
//如果压入的元素大于或栈顶元素,则将栈顶元素压入辅助栈
min_stack.push(min_stack.top());
}
}
void Pop()
{
assert(my_stack.size() > 0 && min_stack.size() > 0);
my_stack.pop();
min_stack.pop();
}
T Min() const
{
assert(my_stack.size() > 0 && min_stack.size() > 0);
return min_stack.top();
}
void ShowStack()
{
if (my_stack.size() > 0)
{
//显示元素
int lenstack = my_stack.size();
cout << "The size of stack:" << lenstack << endl;
for (size_t i = 0; i < lenstack; i++)
{
int top_value= my_stack.top();
show_stack.push(top_value);
cout << "显示栈中第" << i << "个元素:" << top_value << endl;
my_stack.pop();
}
//放回元素
for (size_t i = 0; i < show_stack.size(); i++)
{
int top_value = show_stack.top();
my_stack.push(top_value);
//cout << "栈中第" << i << "个元素:" << top_value << endl;
show_stack.pop();
}
}
else
{
cout << "The element of stack is empty,please check!!" << endl;
}
}
};
#endif // !MINELEMENT_H
// Test21.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include"MinElement.h"
#include<random>
using namespace std;
void main()
{
//类模板实例化
MinElement<int> myminelement;
uniform_int_distribution<unsigned> u(0, 9);
default_random_engine e; // 生成无符号随机整数
for (size_t i = 0; i < 10; i++)
{
// 将 u 作为随机数源
// 每个调用返回在指定范围内并服从均匀分布的值
int value = u(e);
cout << value << " ";
myminelement.Push(value);
}
cout << endl;
//测试结果
myminelement.Pop();
const int min1=myminelement.Min();
cout <<"第一次显示最小值:"<< min1 << endl;
myminelement.Pop();
const int min2 = myminelement.Min();
cout << "第二次显示最小值:" << min2 << endl;
myminelement.ShowStack();
}