设计一个有getMin功能的栈(C++)

设计一个有getMin功能的栈

【题目】

    实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈种最小元素的操作。

【要求】

  1. pop、push、getMin操作的时间复杂度都是 O(1)。

  2. 设计的栈类型可以使用现成的栈结构。

【C++实现】

方法一

    使用两个栈,一个正常保存数据:stack_Data,另一个用于保存当前情况下的最小值:stack_Min。

       压栈情况:

    1. 当Min栈空的时候直接压入。

    2. 当Min非空时候,Min栈顶元素要保持是在Data栈中最小的,因此压栈的时候需要进行比较。当压栈元素小于等于Min栈栈顶元素时,说明压栈元素在压栈后将成为当前最小值,因此需要一起压入Min栈中。

    3. Data栈无论何时都需要压栈。

    弹栈情况:

    1. 当Data栈非空时直接弹栈。

    2. 当Data栈弹出的元素等于Min栈顶元素时,Min栈需要一并弹出。

    代码实现:

        头函数MyStack.h:

     1#pragma once
     2#include 
     3using namespace std;
     4class MyStack {
     5public:
     6    //用于保存数据
     7    stack stack_Data;
     8    //用于保存当前最小值
     9    stack stack_Min;
    10
    11    //弹栈
    12    void pop() {
    13        if (!stack_Data.empty()) {
    14            int num = stack_Data.top();
    15            stack_Data.pop();
    16            if (num == getMin()) {
    17                stack_Min.pop();
    18            }
    19        }
    20        else
    21            throw new exception("【空栈】:弹出失败!");
    22
    23    }
    24    //压栈
    25    void push(int number) {
    26        if (stack_Min.empty())
    27            stack_Min.push(number);
    28        else if (number <= getMin()) {
    29            stack_Min.push(number);
    30        }
    31        stack_Data.push(number);
    32    }
    33    //得到最小值
    34    int getMin() {
    35        if (stack_Min.empty())
    36            throw new exception("【空栈】:无最小值!");
    37        return stack_Min.top();
    38    }
    39};
    

        主函数main.cpp:

     1// 设计一个有getMin功能的栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
     2//
     3
     4#include 
     5#include "MyStack.h"
     6using namespace std;
     7
     8int main(){
     9    cout << "|-------------------------------------------------|" << endl;
    10    cout << "| 1. 压栈                                         |" << endl;
    11    cout << "| 2. 弹栈                                         |" << endl;
    12    cout << "| 3. 当前最小元素                                 |" << endl;
    13    cout << "| 4. 退出                                         |" << endl;
    14    cout << "|-------------------------------------------------|" << endl;
    15    MyStack mystack;
    16    while (1) {
    17        int num;
    18        cin >> num;
    19        int min;
    20        switch (num)
    21        {
    22        case 1:
    23            cout << "请输入压栈元素:";
    24            int number;
    25            cin >> number;
    26            mystack.push(number);
    27            cout << endl;
    28            break;
    29        case 2:
    30            mystack.pop();
    31            cout << "弹栈成功!" << endl;
    32            break;
    33        case 3:
    34            min = mystack.getMin();
    35            cout << "当前最小值:" << min << endl;
    36            break;
    37        case 4:
    38            return 0;
    39        }
    40    }
    41}
    

    方法二

        与一相类似,区别在于是否当压栈元素大于Min栈顶元素时,方法一是不进行压栈操作的,而方法二将会进行压栈操作,所压栈的元素是当前最小值(也就是Min栈顶元素)。

        对于弹栈操作,方法一需要进行判断是否当前弹栈元素是当前最小值,而方法二直接弹出即可,无需判断。

    但无论方法一还是方法二,时间复杂度都是O(1),空间复杂度都是O(n)。

        

你可能感兴趣的:(设计一个有getMin功能的栈(C++))