zoukankan      html  css  js  c++  java
  • 使用C++模板实现栈的求最小值功能

    -----Test.h文件-----------------------------------------

    #ifndef	TEST_H
    #define TEST_H
    #include<iostream>
    using namespace std;
    template<class T>
    class CMyStack
    {
    private:
    	struct Item
    	{
    	public:
    		T data;
    		Item *next;
    		Item():next(NULL){}
    	};
    	Item *m_data;
    	Item *m_min;
    	CMyStack(const CMyStack&);
    	CMyStack& operator=(const CMyStack&);
    public:
    	CMyStack();
    	~CMyStack();
    	T &top();
    	bool empty();
    	void pop();
    	void push(const T &);
    	const T &min();
    };
    template<class T>
    CMyStack<T>::CMyStack():m_data(NULL),m_min(NULL){}
    template<class T>
    CMyStack<T>::~CMyStack()
    {
    	if(m_data!=NULL)
    	{
    
    		Item *p,*q;
    		p=m_data;
    		q=NULL;
    		while(p!=NULL)
    		{
    			q=p;
    			p=p->next;
    			delete q;
    		}
    	}
    }
    template<class T>
    T& CMyStack<T>::top()
    {
    	if(!empty())
    		return m_data->data;
    	else
    		throw exception("stack is empty");
    }
    template<typename T>
    bool CMyStack<T>::empty()
    {
    	if(m_data==NULL)
    		return true;
    	else
    		return false;
    }
    template<typename T>
    void CMyStack<T>::pop()
    {
    	if(!empty())
    	{
    		Item *p=m_data;
    		m_data=m_data->next;
    		delete p;
    		p=m_min;
    		m_min=m_min->next;
    		delete p;
    	}
    	else
    	{
    		throw exception("stack is empty");
    	}
    }
    template<typename T>
    void CMyStack<T>::push(const T &t)
    {
    	Item *p=new Item();
    	p->data=t;
        Item *q=new Item;
    	if(!empty())
    	{
    		if(t>m_min->data)
    		{
    			q->data=m_min->data;
    		}
    		else
    			q->data=t;
    	}
    	else
    	{
    		q->data=t;
    	}
    	q->next=m_min;
    	m_min=q;
    	p->next=m_data;
    	m_data=p;
    }
    template<typename T>
    const T &CMyStack<T>::min()
    {
    	if(!empty())
    	{
    		return m_min->data;
    	}
    	else
    	{
    		throw exception("stack is empty");
    	}
    }
    #endif
    

    ----------------------main.cpp中的调用-----------------------------------------------

    void main()
    { 
    	CMyStack<int> myStack;
    	int a;
    	for(int i=0;i<5;i++)
    	{
    		cin>>a;
    		myStack.push(a);
    		cout<<"min:"<<myStack.min()<<endl;
    	}
    	for(int i=0;i<5;i++)
    	{
    		cout<<"min:"<<myStack.min()<<endl;
    		myStack.pop();
    	}
    	system("pause");
    }
    

      

  • 相关阅读:
    webpack安装填坑('webpack' 不是内部或外部命令,也不是可运行的程序或批处理文件)
    JS中let和var的区别(附加const声明特点)
    浅谈 var bool= false 和 var bool= new Boolean(false)的区别
    "if (!(""a"" in window)) { var a = 1; } alert(a); 为什么结果是undefined"
    浅谈display: none、visibility: hidden、overflow: hidden、opacity: 0
    10Git服务器搭建
    09Git GitHub
    08Git标签
    07Git查看提交历史
    自举驱动电路原理
  • 原文地址:https://www.cnblogs.com/dyc0113/p/3210713.html
Copyright © 2011-2022 走看看