• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 5, comments - 40, trackbacks - 0, articles - 0

            題目:對(duì)現(xiàn)在的Stack(棧)數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn),加一個(gè)min()功能,使之能在常數(shù),即O(1)時(shí)間內(nèi)給出棧中的最小值。可對(duì)push()和pop()函數(shù)進(jìn)行修改,但要求其時(shí)間復(fù)雜度都只能是O(1)。

            題目是在http://akalius.javaeye.com/blog/162156看到的,提供了兩種方法。不幸的是第一種方法是錯(cuò)誤的,第二種方法也不完全正確。都沒(méi)有考慮到連續(xù)壓入、彈出和有相同元素的情況。我用的方法是基于第一種的,即在push操作前先將要壓入的數(shù)值和當(dāng)前棧中的最小值“打包”成一個(gè)結(jié)點(diǎn)再壓入,如果棧為空,則和自身一起打包。這樣在彈出一個(gè)元素后,棧中的最小元素可直接由彈出的結(jié)點(diǎn)獲得。
            其實(shí)這個(gè)算法寫(xiě)起來(lái)很簡(jiǎn)單,我順便復(fù)習(xí)了一下C++的模板方面的東西。C++平時(shí)用得不多,模板這玩意兒更不常用,以至于發(fā)現(xiàn)手生多了。
            #include <vector>   
            #include 
            <utility>   
            using namespace std;   
              
            template
            <class T>   
            class Stack{   
                vector
            <pair<T,T> > stack;   
                T minimum;   
            public:   
                vector
            <pair<T,T> >& push(T e);   
                vector
            <pair<T,T> >& pop();   
                T min();   
            };   
            template
            <class T>   
            vector
            <pair<T,T> >& Stack<T>::push(T e){   
                
            if (stack.empty()){   
                    minimum
            =e;   
                }   
                pair
            <T,T> node(e,minimum);   
                stack.push_back(node);   
                
            if (e<minimum){   
                    minimum
            =e;   
                }   
            }   
            template
            <class T>   
            vector
            <pair<T,T> >& Stack<T>::pop(){   
                pair
            <T,T> node=stack.back();   
                minimum
            =node.second;   
                stack.pop_back();   
            }   
            template
            <class T>   
            T Stack
            <T>::min(){   
                
            return minimum;   
            }
            手生多了,這么點(diǎn)兒東西寫(xiě)了有20分鐘。我測(cè)試了幾組數(shù)據(jù),應(yīng)該沒(méi)什么問(wèn)題。在JavaEye上有些朋友提到了最小堆,但難以實(shí)現(xiàn)push和pop的O(1)操作。其實(shí)根本沒(méi)有必要,有些問(wèn)題看似很難,很多時(shí)候是我們想復(fù)雜了。

            Feedback

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-02-17 13:09 by Zeus2
            對(duì),就是弄個(gè)結(jié)構(gòu)把次小值都記住了。

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-02-18 10:07 by w2001
            其實(shí)沒(méi)有很難,就是翻來(lái)覆去考智力

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-02-18 15:37 by DeathKnight
            棧為空時(shí) 你的min返回的結(jié)果是無(wú)意義的 應(yīng)該在min中加一個(gè)邊界判斷

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-02-19 07:40 by Encoh
            確實(shí)是智力大比拼啊,呵呵。

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-02-19 09:45 by 游客
            這個(gè)實(shí)現(xiàn)緩存了一個(gè)對(duì)象副本,效率不高,緩存指針更好一些。

            # re: 一道Google面試題的解答[未登錄](méi)  回復(fù)  更多評(píng)論   

            2008-02-19 13:01 by kevin
            hash

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-02-22 14:45 by hehe
            I c~~

            # re: 一道Google面試題的解答  回復(fù)  更多評(píng)論   

            2008-03-02 09:24 by Santa
            哈哈,就是再添加上一個(gè)保存最小值的stack嘛,在 push pop的時(shí)候適當(dāng)添加最小值棧頂?shù)脑丶纯伞2贿^(guò)要注意會(huì)出現(xiàn)多個(gè)最小值的情況,適當(dāng)?shù)挠?jì)數(shù)一下會(huì)好些

            # re: 一道Google面試題的解答[未登錄](méi)  回復(fù)  更多評(píng)論   

            2009-04-09 22:53 by jerry
            1. 把樓主的程序稍微簡(jiǎn)化了一下。
            2. 加了一個(gè)main文件。

            文件MyStack.h:

            #ifndef MYSTACK_H_
            #define MYSTACK_H_

            #include <vector>
            #include <utility>
            using std::vector;
            using std::pair;

            template<class T>
            class MyStack {
            private:
            vector< pair<T, T> > stack;
            T minimum;
            public:
            MyStack();
            virtual ~MyStack();

            void push(T e);
            void pop();
            T top();
            T min();
            };


            template<class T>
            MyStack<T>::MyStack() {
            // TODO Auto-generated constructor stub
            }

            template<class T>
            MyStack<T>::~MyStack() {
            // TODO Auto-generated destructor stub
            }

            template<class T>
            void MyStack<T>::push(T e) {
            if (stack.empty()) {
            minimum = e;
            }

            stack.push_back( pair<T, T>(e, minimum) );
            if (e < minimum) {
            minimum = e;
            }
            }
            template<class T>
            void MyStack<T>::pop() {
            minimum = stack.back().second;
            stack.pop_back();
            }

            template<class T>
            T MyStack<T>::top() {
            return stack.back().first;
            }

            template<class T>
            T MyStack<T>::min() {
            return minimum;
            }

            #endif /* MYSTACK_H_ */

            文件Main.cpp:
            #include <iostream>
            using namespace std;

            #include "MyStack.h"

            int main() {
            cout << "Hello World!" << endl;

            MyStack<int> stack;
            stack.push(34);
            stack.push(343);
            stack.push(1);
            cout << "Min value: " << stack.min() << endl;
            cout << "Top value: " << stack.top() << endl;

            stack.pop();
            cout << "Min value: " << stack.min() << endl;
            cout << "Top value: " << stack.top() << endl;

            return 0;
            }


            久久精品中文字幕有码| 久久精品久久久久观看99水蜜桃 | 97久久综合精品久久久综合| 怡红院日本一道日本久久| 久久狠狠高潮亚洲精品| 亚洲成色www久久网站夜月| 精品国产乱码久久久久软件| 欧美粉嫩小泬久久久久久久| 久久久久一级精品亚洲国产成人综合AV区| 久久99热国产这有精品| 7国产欧美日韩综合天堂中文久久久久 | 人妻丰满AV无码久久不卡| 亚洲精品美女久久久久99| 久久久久久亚洲Av无码精品专口 | 99国产精品久久| 国产精品久久一区二区三区 | 久久亚洲国产成人精品无码区| 久久精品国产亚洲av瑜伽| 久久天天日天天操综合伊人av| 欧美色综合久久久久久| 日产精品久久久久久久| 亚洲AV无码久久精品色欲| 青草国产精品久久久久久| 丰满少妇人妻久久久久久| 国产2021久久精品| 久久久久亚洲av成人网人人软件| 亚洲国产一成人久久精品| 伊人久久免费视频| 老男人久久青草av高清| 久久久久国产精品| 久久丫忘忧草产品| 精品国产福利久久久| 久久久亚洲欧洲日产国码是AV| 久久精品国产99国产精品澳门| 热RE99久久精品国产66热| 国产精品久久久久无码av| 伊人久久五月天| 国产成人精品久久免费动漫| 亚洲精品综合久久| 国产精品gz久久久| 久久精品99久久香蕉国产色戒 |