【16】包含min函数的栈

【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();


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值