• <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 - 6,  comments - 30,  trackbacks - 0
            今天使用visual C++ 2010編譯器編寫(xiě)程序逆波蘭表達(dá)式求值
            但是遭遇了以前從未看到的問(wèn)題,在此求助各位,謝謝
            文件Stack.h
             1template<class T>
             2class Stack
             3{
             4public:
             5        Stack(int size=0);//構(gòu)造大小為size的堆棧
             6        ~Stack(){delete p;}//撤銷(xiāo)堆棧
             7        bool IsFull();//判斷堆棧是否已滿
             8        bool IsEmpty();//判斷堆棧是否為空
             9        void Push(T &x);//將x壓入堆棧
            10        T Pop(T &x);//將棧頂元素彈出用x保存
            11private:
            12        int Size;//大小
            13        int top;//棧頂
            14        T  *p;//數(shù)組指針
            15}
            ;
            實(shí)現(xiàn)源文件Stack.cpp
             1#include"Stack.h"
             2
             3template<class T>
             4void Stack<T>::Push(T &x)
             5{
             6        p[top++]=x;//將x保存于棧頂,棧頂+1
             7}

             8
             9template<class T>
            10T Stack<T>::Pop(T &x)
            11{
            12        x=p[--top];//x保存棧頂元素,棧頂-1
            13        return x;
            14}

            15
            16template<class T>
            17Stack<T>::Stack(int size)
            18{
            19        Size=size;//棧大小為size
            20        top=0;//棧頂top指向0
            21        p=new T[Size];//為p開(kāi)辟Size大小的空間
            22}

            23
            24template<class T>
            25bool Stack<T>::IsFull()
            26{
            27        return top==Size;
            28}
            //判斷堆棧是否已滿
            29
            30template<class T>
            31bool Stack<T>::IsEmpty()
            32{
            33        return top==0;
            34}
            //判斷堆棧是否為空

            main.cpp
              1#include<iostream>
              2#include<stdio.h>
              3#include"Stack.h"
              4const int MaxSize=40;//由于定義數(shù)組時(shí)開(kāi)辟空間大小
              5using namespace std;
              6
              7/*
              8*逆波蘭表達(dá)式求值函數(shù)
              9*/

             10float LiBolan(char *array){//array存儲(chǔ)表達(dá)式
             11        Stack<float> sta(MaxSize);//建立大小為Maxsize的堆棧
             12        int i=0;
             13        if(array[0]=='.'){
             14                cout<<"表達(dá)式錯(cuò)誤:小數(shù)表示錯(cuò)誤"<<endl;
             15                return 0;
             16        }

             17        while(array[i]!='\0'){//當(dāng)表達(dá)式?jīng)]有結(jié)束
             18                if(array[i]=='.'){//數(shù)字第一個(gè)字符為小數(shù)點(diǎn)或運(yùn)算符后是小數(shù)點(diǎn)
             19                        cout<<"表達(dá)式錯(cuò)誤:小數(shù)表示錯(cuò)誤"<<endl;
             20                        return 0;
             21                }

             22                if(i==0&&array[i]=='-'){//判斷第一個(gè)是否負(fù)數(shù),后面的沒(méi)有必要判斷,如果是
             23                        i++;//處理下一個(gè)字符
             24                        float tem=0;
             25                        while(array[i]>='0'&&array[i]<='9'){
             26                                tem=(float)array[i]-48+tem*10;//先計(jì)算該負(fù)數(shù)的絕對(duì)值
             27                                i++;
             28                        }

             29                        if(array[i]=='.'){//若存在小數(shù)
             30                                i++;//忽略該位
             31                                if(!(array[i]>='0'&&array[i]<='9')){//小數(shù)點(diǎn)后不是數(shù)字
             32                                        cout<<"表達(dá)式錯(cuò)誤:小數(shù)表示錯(cuò)誤"<<endl;
             33                                        return 0;
             34                                }

             35                        }

             36                        Stack<char> s(7);//用于存儲(chǔ)小數(shù)字符
             37                        while(array[i]>='0'&&array[i]<='9'){
             38                                s.Push(array[i]);
             39                                i++;
             40                        }

             41                        float item=0;
             42                        char x;
             43                        while(!s.IsEmpty())
             44                                item=((float)s.Pop(x)-48)*0.1+item*0.1;//計(jì)算小數(shù)
             45                        tem+=item;
             46                        tem=-tem;//取相反數(shù)得到原數(shù)
             47                        sta.Push(tem);//將該數(shù)壓入棧中
             48                }

             49                if(array[i]>='0'&&array[i]<='9'){//其他時(shí)候,判斷是否為數(shù)字
             50                        float tem=0;
             51                        while(array[i]>='0'&&array[i]<='9'){//計(jì)算整數(shù)部分
             52                                tem=(float)array[i]-48+tem*10;
             53                                i++;
             54                        }

             55                        if(array[i]=='.'){//若存在小數(shù)
             56                                i++;//忽略該位
             57                                if(!(array[i]>='0'&&array[i]<='9')){//小數(shù)點(diǎn)后不是數(shù)字
             58                                        cout<<"表達(dá)式錯(cuò)誤:小數(shù)表示錯(cuò)誤"<<endl;
             59                                        return 0;
             60                                }

             61                        }

             62                        Stack<char> s(7);//用于存儲(chǔ)小數(shù)字符
             63                        while(array[i]>='0'&&array[i]<='9'){
             64                                s.Push(array[i]);
             65                                i++;
             66                        }

             67                        float item=0;
             68                        char x;
             69                        while(!s.IsEmpty())
             70                                item=((float)s.Pop(x)-48)*0.1+item*0.1;//計(jì)算小數(shù)
             71                        tem+=item;
             72                    sta.Push(tem);
             73                }

             74            if(array[i]=='+'||array[i]=='-'||array[i]=='*'||array[i]=='/'){
             75                        float it1,it21,it22;//it21棧頂元素,it22倒數(shù)第二個(gè),it1是it21,it22對(duì)應(yīng)運(yùn)算的值
             76                        char ch=array[i];
             77                        switch(ch){
             78                        case '+':it21=sta.Pop(it21);
             79                                    if(sta.IsEmpty()){
             80                                                cout<<"表達(dá)是錯(cuò)誤:運(yùn)算符比對(duì)應(yīng)所需的運(yùn)算數(shù)多"<<endl;//彈出一個(gè)運(yùn)算數(shù)后為空
             81                                                return 0;
             82                                        }

             83                                     it22=sta.Pop(it22);
             84                                         it1=it21+it22;
             85                                     sta.Push(it1);break;
             86                        case '-':it21=sta.Pop(it21);
             87                                     if(sta.IsEmpty()){
             88                                                cout<<"表達(dá)式錯(cuò)誤:運(yùn)算符比對(duì)應(yīng)所需的運(yùn)算數(shù)多"<<endl;
             89                                                return 0;
             90                                        }

             91                                     it22=sta.Pop(it22);
             92                                         it1=it22-it21;
             93                                     sta.Push(it1);break;
             94                        case '*':it21=sta.Pop(it21);
             95                                     if(sta.IsEmpty()){
             96                                                cout<<"表達(dá)式錯(cuò)誤:運(yùn)算符比對(duì)應(yīng)所需的運(yùn)算數(shù)多"<<endl;
             97                                                return 0;
             98                                        }

             99                                     it22=sta.Pop(it22);
            100                                         it1=it21*it22;
            101                                     sta.Push(it1);break;
            102                        case '/':it21=sta.Pop(it21);
            103                                     if(sta.IsEmpty()){
            104                                                cout<<"表達(dá)式錯(cuò)誤:運(yùn)算符比對(duì)應(yīng)所需的運(yùn)算數(shù)多"<<endl;
            105                                                return 0;
            106                                        }

            107                                     it22=sta.Pop(it22);
            108                                         it1=it22/it21;
            109                                     sta.Push(it1);break;
            110                        default:break;
            111                        }

            112                        i++;
            113                }

            114                else
            115                        i++;
            116        }

            117        float value;
            118        sta.Pop(value);
            119        if(!sta.IsEmpty()){
            120                cout<<"表達(dá)式錯(cuò)誤:運(yùn)算數(shù)多于所需的運(yùn)算符"<<endl;//最后棧不為空
            121                return 0;
            122        }

            123        return value;
            124}

            125void main(){        
            126        printf("請(qǐng)輸入一個(gè)后綴表達(dá)式:");
            127        char str[MaxSize];
            128        gets(str);
            129        float value=LiBolan(str);
            130        printf("%2.2f\n",value);
            131}

            當(dāng)用Visual C++ 6.0編譯時(shí)正確,用visualC++201編譯時(shí),如果不分頭文件源文件,即直接把這三個(gè)文件放在man.cpp中編譯正確,當(dāng)時(shí)當(dāng)把他們分開(kāi)后
            其文件結(jié)構(gòu)圖如下時(shí)編譯通不過(guò)

            其問(wèn)題描述如下
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: bool __thiscall Stack<float>::IsEmpty(void)" (?IsEmpty@?$Stack@M@@QAE_NXZ),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: float __thiscall Stack<float>::Pop(float &)" (?Pop@?$Stack@M@@QAEMAAM@Z),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: void __thiscall Stack<float>::Push(float &)" (?Push@?$Stack@M@@QAEXAAM@Z),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: char __thiscall Stack<char>::Pop(char &)" (?Pop@?$Stack@D@@QAEDAAD@Z),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: bool __thiscall Stack<char>::IsEmpty(void)" (?IsEmpty@?$Stack@D@@QAE_NXZ),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: void __thiscall Stack<char>::Push(char &)" (?Push@?$Stack@D@@QAEXAAD@Z),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: __thiscall Stack<char>::Stack<char>(int)" (??0?$Stack@D@@QAE@H@Z),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>t.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "public: __thiscall Stack<float>::Stack<float>(int)" (??0?$Stack@M@@QAE@H@Z),該符號(hào)在函數(shù) "float __cdecl LiBolan(char *)" (?LiBolan@@YAMPAD@Z) 中被引用
            1>E:\Visual2010\t\Debug\t.exe : fatal error LNK1120: 8 個(gè)無(wú)法解析的外部命令
            1>
            1>生成失敗。
            1>
            1>已用時(shí)間 00:00:00.79
            ========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) ==========
            posted on 2011-01-19 14:22 あ維wêiセ 閱讀(2776) 評(píng)論(12)  編輯 收藏 引用 所屬分類(lèi): C++

            FeedBack:
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 14:42 | coolypf
            Stack.cpp的內(nèi)容全部放到Stack.h里面。  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 14:45 | あ維wêiセ
            @coolypf
            但是按照程序編寫(xiě)習(xí)慣,不是應(yīng)該把他們分開(kāi)嗎?  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 14:49 | ChowZenki
            如果不想寫(xiě)在hpp中你可以去掉template  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 14:54 | あ維wêiセ
            去掉template后那個(gè)T就是一個(gè)未知符號(hào)了@ChowZenki
              回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 14:59 | ChowZenki
            @あ維w&#234;iセ
            實(shí)現(xiàn)寫(xiě)在hpp中是template的使用約定...
            具體去看看stl相關(guān)的書(shū)吧
            如果要用就必須這么做
            否則你只能改寫(xiě)成非模板的類(lèi)了  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 15:06 | あ維wêiセ
            @ChowZenki
            額,是不是用了template就必須把.cpp與.h文件寫(xiě)在一起呀?
            謝謝你為我解決  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題[未登錄](méi)
            2011-01-19 20:12 | codejie
            建議不要C和C++混用。。。下面這個(gè)風(fēng)格非常不好。。
            1#include<iostream>
            2#include<stdio.h>  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 20:14 | あ維wêiセ
            @codejie
            關(guān)鍵是要用的gets()函數(shù)
            用while(...)
            {
            .....
            }老是不能結(jié)束  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-19 22:51 | jmchxy
            template的參數(shù)需要在使用時(shí)候特化,你不放到包含文件中,調(diào)用的文件不知道怎么特化。

            template函數(shù)或類(lèi)是在被調(diào)用到的時(shí)候才生成真正的函數(shù)體或類(lèi),如果調(diào)用者看不到模板的實(shí)現(xiàn)就不能生成真正的函數(shù)體或類(lèi)  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-23 08:28 | coderman
            對(duì)于模板,編譯時(shí)和普通代碼的編譯是有區(qū)別的,普通代碼在編譯時(shí)只需要知道函數(shù)定義即可編譯通過(guò),但模板不一樣,模板編譯有兩個(gè)階段:
            1、先編譯類(lèi)模板本身,看是否有語(yǔ)法錯(cuò)誤,例如是不是少寫(xiě)了分號(hào)
            2、當(dāng)模板實(shí)例化時(shí)再進(jìn)行一次編譯,即編譯實(shí)例化的后的代碼,檢查你指定的類(lèi)型能不能在模板里被支持,這時(shí)編譯器需要清楚的知道模板的具體實(shí)現(xiàn),所以常規(guī)的做法是將聲明和實(shí)現(xiàn)都放在一個(gè).h文件里

            你可以看一下開(kāi)源的代碼(例如 boost庫(kù)的 asio),里面的模板都放.h文件里

            感覺(jué)樓主的代碼在安全上有點(diǎn)問(wèn)題,作為一個(gè)stack,對(duì)它的調(diào)用者來(lái)說(shuō)應(yīng)該是安全的,你的代碼里應(yīng)該檢查下標(biāo)是否越界,指針是否為空,刪除指針時(shí)應(yīng)該判空并置NULL  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-01-28 12:37 | summerheart
            vc6.共認(rèn)的對(duì)標(biāo)準(zhǔn)C++支持不夠好,大概也就60%上下吧。
            而Vc2010對(duì)標(biāo)準(zhǔn)C++的支持更完全。這也是新版本的亮點(diǎn)之一。
            所以 樓主還是按標(biāo)準(zhǔn)的C++模板編寫(xiě)方法寫(xiě)吧。  回復(fù)  更多評(píng)論
              
            # re: 關(guān)于Visual C++2010編譯器的問(wèn)題
            2011-02-27 21:28 | marmot
            樓上說(shuō)的比較對(duì),寫(xiě)模板最好用包含模型
            用分離模型編譯容易出問(wèn)題
            Boost中很多子庫(kù)都采用的是包含模型  回復(fù)  更多評(píng)論
              
            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            常用鏈接

            留言簿(1)

            隨筆分類(lèi)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品久久久噜噜噜久久久| 国内精品久久久久国产盗摄| 日本久久久久久中文字幕| 国内精品久久久久影院薰衣草 | 亚洲国产精品综合久久一线| 91精品国产91热久久久久福利 | 狠狠色噜噜色狠狠狠综合久久| 精品久久综合1区2区3区激情| 香港aa三级久久三级| 精品久久久久久久无码 | 中文精品久久久久国产网址| 日日噜噜夜夜狠狠久久丁香五月 | 精品久久久无码人妻中文字幕| 伊人久久国产免费观看视频| 伊人久久成人成综合网222| 伊色综合久久之综合久久| 亚洲精品视频久久久| 久久久亚洲裙底偷窥综合| 久久免费看黄a级毛片| 青草国产精品久久久久久| 久久久一本精品99久久精品66| 久久Av无码精品人妻系列| 久久er国产精品免费观看2| 国产精品激情综合久久| 亚洲国产成人久久一区久久| 久久久亚洲欧洲日产国码是AV| 色婷婷综合久久久久中文一区二区| 欧美大香线蕉线伊人久久| 国产91色综合久久免费| 国产精品免费久久久久久久久| 日本久久中文字幕| 久久久久久久久久久久中文字幕 | 久久精品国产亚洲av麻豆图片 | 亚洲v国产v天堂a无码久久| 亚洲国产精品无码久久久秋霞2| 国产情侣久久久久aⅴ免费| 精品视频久久久久| 一本久久知道综合久久| 岛国搬运www久久| 久久午夜无码鲁丝片| 亚洲国产精品久久66|