• <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編譯器編寫程序逆波蘭表達式求值
            但是遭遇了以前從未看到的問題,在此求助各位,謝謝
            文件Stack.h
             1template<class T>
             2class Stack
             3{
             4public:
             5        Stack(int size=0);//構造大小為size的堆棧
             6        ~Stack(){delete p;}//撤銷堆棧
             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;//數組指針
            15}
            ;
            實現源文件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開辟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;//由于定義數組時開辟空間大小
              5using namespace std;
              6
              7/*
              8*逆波蘭表達式求值函數
              9*/

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

             17        while(array[i]!='\0'){//當表達式沒有結束
             18                if(array[i]=='.'){//數字第一個字符為小數點或運算符后是小數點
             19                        cout<<"表達式錯誤:小數表示錯誤"<<endl;
             20                        return 0;
             21                }

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

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

             35                        }

             36                        Stack<char> s(7);//用于存儲小數字符
             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;//計算小數
             45                        tem+=item;
             46                        tem=-tem;//取相反數得到原數
             47                        sta.Push(tem);//將該數壓入棧中
             48                }

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

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

             61                        }

             62                        Stack<char> s(7);//用于存儲小數字符
             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;//計算小數
             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倒數第二個,it1是it21,it22對應運算的值
             76                        char ch=array[i];
             77                        switch(ch){
             78                        case '+':it21=sta.Pop(it21);
             79                                    if(sta.IsEmpty()){
             80                                                cout<<"表達是錯誤:運算符比對應所需的運算數多"<<endl;//彈出一個運算數后為空
             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<<"表達式錯誤:運算符比對應所需的運算數多"<<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<<"表達式錯誤:運算符比對應所需的運算數多"<<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<<"表達式錯誤:運算符比對應所需的運算數多"<<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<<"表達式錯誤:運算數多于所需的運算符"<<endl;//最后棧不為空
            121                return 0;
            122        }

            123        return value;
            124}

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

            當用Visual C++ 6.0編譯時正確,用visualC++201編譯時,如果不分頭文件源文件,即直接把這三個文件放在man.cpp中編譯正確,當時當把他們分開后
            其文件結構圖如下時編譯通不過

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

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

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

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

            感覺樓主的代碼在安全上有點問題,作為一個stack,對它的調用者來說應該是安全的,你的代碼里應該檢查下標是否越界,指針是否為空,刪除指針時應該判空并置NULL  回復  更多評論
              
            # re: 關于Visual C++2010編譯器的問題
            2011-01-28 12:37 | summerheart
            vc6.共認的對標準C++支持不夠好,大概也就60%上下吧。
            而Vc2010對標準C++的支持更完全。這也是新版本的亮點之一。
            所以 樓主還是按標準的C++模板編寫方法寫吧。  回復  更多評論
              
            # re: 關于Visual C++2010編譯器的問題
            2011-02-27 21:28 | marmot
            樓上說的比較對,寫模板最好用包含模型
            用分離模型編譯容易出問題
            Boost中很多子庫都采用的是包含模型  回復  更多評論
              
            <2011年12月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久免费香蕉视频| 99久久婷婷国产一区二区| 一级做a爰片久久毛片人呢| 久久精品综合网| 香蕉久久夜色精品国产2020 | 777午夜精品久久av蜜臀| 国产999精品久久久久久| 国产精品久久国产精麻豆99网站| 亚洲综合伊人久久综合| 国内精品伊人久久久久777| 久久www免费人成看片| 久久精品国产亚洲av麻豆图片| 伊人久久亚洲综合影院| 国内高清久久久久久| 国产亚洲精品自在久久| 久久精品9988| 久久精品亚洲精品国产欧美| 久久e热在这里只有国产中文精品99| 国产高潮国产高潮久久久91| 久久精品人妻一区二区三区| 国产精品久久久久久五月尺| 久久婷婷五月综合国产尤物app | 免费国产99久久久香蕉| 93精91精品国产综合久久香蕉 | 久久久中文字幕| 亚洲а∨天堂久久精品9966| 日本久久久久亚洲中字幕| 久久超碰97人人做人人爱| 青青草国产精品久久久久| 亚洲性久久久影院| 99久久人妻无码精品系列| 国内精品久久久久久久久电影网| 亚洲色欲久久久久综合网| 久久国产欧美日韩精品| 久久久精品久久久久久| 色综合久久中文字幕无码| 久久国产视频99电影| 精品少妇人妻av无码久久| 四虎国产精品成人免费久久| 久久99精品国产| 一本色道久久99一综合|