[学习笔记-C++篇]day22 剑指9,30,6

本文介绍了如何使用两个栈实现队列和包含最小值功能的栈。在第一个问题中,通过两个栈交替操作实现了队列的功能;在第二个问题中,使用一个额外的栈来辅助获取最小值,避免了每次查找最小值时遍历整个栈的开销。最后,讨论了从尾到头打印链表的解题思路,强调了处理链表指针操作的注意事项。
摘要由CSDN通过智能技术生成

配套力扣剑指offer剑指 Offer
刷题顺序同上。同时结合书上内容。


1. 剑指 Offer 09. 用两个栈实现队列

最大的问题之读不懂题。
以为输入输出要自己写,忘记这是核心代码模式,然后在那边写main,emm。

class CQueue {
public:
    stack<int> s1;
    stack<int> s2;

    CQueue() {
        //s1=new stack<>();
        //s2=new stack<>();
        
    }
    
    void appendTail(int value) {
        s1.push(value);
    }
    
    int deleteHead() {
        if(s1.empty()) return -1;
        else
        {
            int tmp;
            while(!s1.empty())
            {
                s2.push(s1.top());
                s1.pop();
            }
            tmp=s2.top();
            s2.pop();
            while(!s2.empty())
            {
                s1.push(s2.top());
                s2.pop();
            }
            return tmp;
        }
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */
 #if 0
 int main()
 {
     string in[10000];//输入字符串数组
     int i=0;
     while(cin>>in[i++]) {}//最后第i位为空
     int size=i;//输入字符串个数

     int innum[10000];//输入参数
     i=0;
     while(cin>>innum[i++]) {}
     
     string out[10000];//输出结果
     i=0;
     
     if(in[0]=="CQueue")
     {
         CQueue * obj = new CQueue();
         out[i++]="null";
     }
     for(int j=1;j<size;j++)//循环判断指令
     {
         if(in[j]=="appendTail")
         {
             obj->appendTail(innum[j]);
             out[i++]="null";
         }
         if(in[j]=="deleteHead")
         {
             out[i++]=obj->deleteHead();
         }
     }

     cout << "["; 
     for(int k=0;k<size;k++)
     {
         cout << out[k];
         if(k<size-1) cout << ",";
         else cout << "]";
     }

     delete CQueue;
 }
 #endif

2. 剑指 Offer 30. 包含min函数的栈

第1版,沿用2个栈,一般可用,太多超时。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s1;
    stack<int> s2;//暴力思路,参照题9,输入到另一个栈检测,然后再返回去
    int tmp;//保存最小值,先初始化为最大值

    MinStack() {}
    
    void push(int x) {
        s1.push(x);
    }
    
    void pop() {
        if(s1.empty()) return;
        s1.pop();
    }
    
    int top() {
        return s1.top();
    }
    
    int min() {
        tmp=INT_MAX;//保存最小值,先初始化为最大值
        while(!s1.empty())
        {
            tmp=s1.top()<tmp?s1.top():tmp;
            s2.push(s1.top());
            s1.pop();
        }
        while(!s2.empty())
        {
            s1.push(s2.top());
            s2.pop();
        }
        return tmp;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */

就用vector实现栈功能,不会超时。

class MinStack {
public:
    /** initialize your data structure here. */

    vector<int> s1;//改进一下,用vector
    int tmp;//保存最小值,先初始化为最大值

    MinStack() {}
    
    void push(int x) {
        s1.push_back(x);
    }
    
    void pop() {
        if(s1.empty()) return;
        s1.pop_back();
    }
    
    int top() {
        return s1[s1.size()-1];
    }
    
    int min() {
        tmp=INT_MAX;//保存最小值,先初始化为最大值
        for(int i=0;i<s1.size();i++)
        {
            tmp=s1[i]<tmp?s1[i]:tmp;
        }
        return tmp;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */

3. 剑指 Offer 06. 从尾到头打印链表

第一次考虑问题大概率会有疏漏,慢慢调整就好。
这里的注意点:
1)类成员函数的输入为指针,所以调用结构体的成员要用->
2)指针可能为空
3)用指针下一位指针是否为空作为判定条件,要记得加上最后一个元素

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> res;//输出结果

    vector<int> reversePrint(ListNode* head) {
        if(head==nullptr) return res;

        while(head->next!=nullptr)
        {
            res.push_back(head->val);
            head=head->next;
        }
        res.push_back(head->val);//把最后一个元素保存上

        reverse(res.begin(),res.end());
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值