zoukankan      html  css  js  c++  java
  • 面试题19:包含min函数的栈


    CStack.h:

    #pragma once
    
    class CStackElement
    {
    public:
    	CStackElement(void){}
    	CStackElement(int data, int min=0)
    	{
    		m_nData = data;
    		m_nMin = min;		
    	}
    
    	~CStackElement(void){}
    
    public: 
    	int m_nData;
    	int m_nMin;	
    };
    
    class CStack
    {
    public:
    	CStack(int maxSize);//普通构造函数,构造一个大小为maxSize的栈
        CStack(const CStack &stack);//拷贝构造函数
    	CStack & operator=(const CStack &stack);//赋值函数
    	~CStack(void);
      
    	void Push(int nPushElement);//向栈中压入一个元素nElement
    	void Pop();//从栈中弹出一个元素,并返回
    	int Min();//O(1)的时间返回最小元素值
    
    private:    
    	CStackElement *m_pStackArr;
    	int m_top;//指向栈顶元素的下一个位置
    	int m_nMaxSize;
    };
    


    CStack.cpp:

    #include "StdAfx.h"
    #include "CStack.h"
    #include <iostream>
    using namespace std;
    
    //普通构造函数,构造一个大小为maxSize的栈
    CStack::CStack(int maxSize)
    {
    	m_top = 0;//指向栈顶元素的下一个位置
    	m_nMaxSize = maxSize;	
    	m_pStackArr = new CStackElement[m_nMaxSize];	
    }
    
    //拷贝构造函数
    CStack::CStack(const CStack &stack)
    {
        m_top = stack.m_top;
    	m_nMaxSize = stack.m_nMaxSize;
    	m_pStackArr = new CStackElement[m_nMaxSize];
    	memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize);
    }
    
    //赋值函数
    CStack & CStack::operator=(const CStack &stack)
    {
        if (this == &stack)//自赋值检查
        {
    		return *this;
        }
    
    	if (stack.m_top != 0)//stack为空
    	{
    		if (m_nMaxSize < stack.m_nMaxSize)
    		{
    			m_nMaxSize = stack.m_nMaxSize;
    			delete [] m_pStackArr;			
    			m_pStackArr = new CStackElement[m_nMaxSize];
    			memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize);
    		}
    	}
    	return *this;
    }
    
    //向栈中压入一个元素nElement
    void CStack::Push(int nPushElement)
    {
         if (m_top == m_nMaxSize)
         {		
    		 cout << "栈满!" << endl;
         }
    	 else if (m_top == 0)//栈空
    	 {
    		 m_pStackArr[m_top++].m_nData = nPushElement; 
    		 m_pStackArr[m_top++].m_nMin = nPushElement;		 
    		 cout << "压入" << nPushElement<< endl;
    	 }
    	 else
    	 {
    		 if (m_pStackArr[m_top-1].m_nMin > nPushElement)
    		 {
    			 m_pStackArr[m_top].m_nMin = nPushElement;
    		 }
    		 else
    		 {
                 m_pStackArr[m_top].m_nMin = m_pStackArr[m_top-1].m_nMin;
    		 }		 
    
    		 m_pStackArr[m_top++].m_nData= nPushElement; 		 
    		 cout << "压入" << nPushElement<< endl;
    	 }
    }
    
    //从栈中弹出一个元素,并返回
    void CStack::Pop()
    {
    	int nPopElement = 0;
    	if (m_top == 0)
    	{
    		nPopElement = -1;
    		cout << "栈空!" << endl;
    	}
    	else
    	{
    		nPopElement = m_pStackArr[--m_top].m_nData;
    		cout << "弹出" << nPopElement << endl;
    	}
    }
    
    //O(1)的时间返回最小元素值
    int CStack::Min()
    {  
    	if (m_top == 0)
    	{
    		cout << "栈空!" << endl;
    		return -1;
    	}
    	else
    	{
    		return m_pStackArr[m_top-1].m_nMin;
    	}  
    }
    
    CStack::~CStack(void)
    {
        
    }
    

    测试代码:

    // 栈和队列的灵活应用一:包含min,max函数的栈.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include <iostream>
    #include "CStack.h"
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CStack stack(20);	
    	stack.Push(4);
    	cout << "Min: " << stack.Min() << endl;
    	
    	stack.Push(5);
    	cout << "Min: " << stack.Min() << endl;	
    
    	stack.Push(2);
    	cout << "Min: " << stack.Min() << endl;	
    
    	stack.Pop();	
    	cout << "Min: " << stack.Min() << endl;
    
    	stack.Push(3);
    	cout << "Min: " << stack.Min() << endl;
    	
    	system("pause");
    	return 0;
    }
    


  • 相关阅读:
    linux 文件类型 文件权限
    微信公众号支付
    struts2 详解
    git 命令行操作
    javascript 闭包
    SVN 基本操作
    javascript 函数 方法
    git
    javascript变量 数组 对象
    Intellij调试debug
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3206574.html
Copyright © 2011-2022 走看看