青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小四的海市蜃樓
Never surrender to complexity
posts - 21,comments - 59,trackbacks - 0
表達式求值的關鍵點在于中綴表達式轉后綴表達式,算法書上都有明確介紹就不多說了。動手實現了一個表達式解析器,支持括號、多位整數以及表達式合法性判斷。今天的狀態實在很差,本想對表達式進行合法性判斷的時候使用一些類似哈希表的技巧,比如使用一個大的bool數組,合法字符ASC碼對應的項設置為1,比如可以直接判斷CHARS['+']是否為true,省去查找的時間。后來發現一共就支持那幾個字符,這樣做未免有點太矯情了。頭腦亂亂的,為了支持多位整數,用了string,感覺怪怪的。

 /* -------------------------------------------------------------------------
//    文件名        :    ExpParser.h
//    創建者        :    dj
//    創建時間    :    2008-1-4 18:35
//    功能描述    :    表達式求值
// -----------------------------------------------------------------------
*/


#ifndef __EXPPARSER_H__
#define __EXPPARSER_H__

#include 
<vector>
#include 
<string>
using namespace std;
typedef vector
<string> strings;

class ExpParser
{
public:
    
int CalcExp(const char* sExp)    //解析表達式并計算
    {
        
if (!CheckExp(sExp))
        
{
            
return 0;
        }

        strings inExp;
        strings postExp;
        GetInExp(inExp, sExp);
        GetPostExp(postExp, inExp);    
        
return CalcPostExp(postExp);
    }

private:
    inline 
int OptrPRI(const string& s)    //得到運算符優先級
    {
        
switch(s[0]) 
        
{
        
case '*':
        
case '/':
            
return 3;
        
case '+':
        
case '-':
            
return 2;
        
case '(':
            
return 1;
        
case '#':
            
return 0;
        
default:
            
return -1;
        }

    }
    
    inline 
bool IsNum(const char* s)        //判斷是否數字
    {
        
return (*s<='9'&&*s>='0');
    }

    inline 
bool IsNum(const string& s)
    
{
        
return (IsNum(&s[0]));
    }

    inline 
bool IsOptr(const char* s)//判斷是否運算符
    {
        
switch(*s) {
        
case '+':
        
case '-':
        
case '*':
        
case '/':
            
return true;
        
default:
            
return false;
        }

    }

    
int Calc(const string& s1, const string& s2, const string& optr)//根據運算符計算結果
    {
        
int n1 = atoi(s1.c_str());
        
int n2 = atoi(s2.c_str());
        
if (optr == "+")
        
{
            
return n1+n2;
        }

        
else if (optr == "-")
        
{
            
return n1-n2;
        }

        
else if (optr == "*")
        
{
            
return n1*n2;
        }

        
else if (optr == "/")
        
{
            
return n1/n2;
        }

        assert(
false);
        
return 0;
    }

    
int CalcPostExp(const strings& postExp)        //計算后綴表達式的結果
    {
        
int n = 0;
        strings::const_iterator it 
= postExp.begin();
        stack
<string> st;                        //運算數臨時棧
        for(; it != postExp.end(); it++)
        
{
            
if(IsNum(*it))                        //數字,直接入棧
                st.push(*it);
            
else                                //運算符,取棧頂兩元素運算,結果進棧
            {
                
string s1 = st.top(); st.pop();
                
string s2 = st.top(); st.pop();
                n 
= Calc(s2, s1, *it);
                
char a[255];
                itoa(n, a, 
10);
                st.push(a);
            }

        }

        
return n;
    }

    
bool CheckExp(const char* sExp)                    //檢查表達式合法性
    {
        stack
<char> st;
        
const char* p = sExp;
        
bool bPrevOptr = true;
        
while(*p!=NULL)
        
{
            
if (IsOptr(p))
            
{
                
if (bPrevOptr)
                
{
                    cout
<<"illegal expression"<<endl;
                    
return false;
                }

                bPrevOptr 
= true;
            }

            
else
            
{
                bPrevOptr 
= false;
                
if (*p=='(')
                
{
                    st.push(
*p);
                }

                
else if (*p==')')
                
{
                    
if(st.empty())
                    
{
                        cout
<<"a '(' is expected"<<endl;
                        
return false;
                    }

                    st.pop();            
                }

                
else if (!IsNum(p))
                
{
                    cout
<<"unexpected symbol"<<endl;
                    
return false;
                }

            }

            p
++;
        }
    
        
if (!st.empty())
        
{
            cout
<<"a ')' is expected"<<endl;
            
return false;
        }

        
return true;
    }

    
    
void GetInExp(strings& inExp, const char* sExp)//根據原始字符串得到中綴表達式
    {
        
string s;
        
int nLen = strlen(sExp);
        
for (int i = 0; i < nLen; i++)
        
{
            
if (IsNum(&sExp[i]))
            
{
                s 
+= sExp[i];
                
if (!IsNum(&sExp[i+1])) 
                
{
                    inExp.push_back(s);
                }

            }
            
            
else
            
{
                s 
= sExp[i];
                inExp.push_back(s);
                s.erase();
            }

        }

    }
    
    
void GetPostExp(strings& postExp, const strings& inExp)//根據中綴表達式得到后綴表達式
    {
        stack
<string> st;                //臨時運算符棧
        st.push("#");
        strings::const_iterator it 
= inExp.begin();
        
for(; it != inExp.end(); it++)
        
{
            
if (IsNum(*it))                //數字直接加入后綴表達式
            {
                postExp.push_back(
*it);
            }

            
else if (*it == "(")        //左括號,入運算符棧
            {
                st.push(
*it);
            }

            
else if (*it == ")")        //右括號,到左括號之間的運算符出棧加入后綴表達式
            {
                
while(st.top()!="(")
                
{
                    postExp.push_back(st.top());
                    st.pop();
                }

                st.pop();
            }

            
else                        //其它運算符,出棧直到大于棧頂元素優先級
            {
                
int nPRI = OptrPRI(*it);

                
while (nPRI<=OptrPRI(st.top()))
                
{
                    postExp.push_back(st.top());
                    st.pop();
                }


                st.push(
*it);
            }

        }

        
while (!st.empty())                //棧內剩余運算符出棧加入后綴表達式
        {
            
if (st.top()!="#")
                postExp.push_back(st.top());
            st.pop();
        }

    }

}
;

#endif

 

int main(int argc, char* argv[])
{
    ExpParser ep;
    
int n = ep.CalcExp("7*(857+142*1000)");
    cout
<<n<<endl;
    
return 0;
}

神奇地數,142857,
142857*1=142857
142857*2=285714
142857*3=428571
142857*4=571428
142857*5=714285
142857*6=857142
142857*7=999999
它發現于埃及金字塔內,
它證明一星期有7天,
它自我累加一次,
就由它的6個數字,
依順序輪值一次,
到了第7天,
它們就放假,
由999999去代班。
新年第一個周末快樂。
posted on 2008-01-04 19:59 小四 閱讀(716) 評論(0)  編輯 收藏 引用 所屬分類: 算法與數據結構
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            精品动漫av| 亚洲国产91精品在线观看| 国产精品超碰97尤物18| 欧美成人69av| 另类av一区二区| 欧美在线观看网址综合| 欧美一区二区三区精品电影| 欧美一区二区三区免费大片| 欧美一区二区在线免费观看 | 欧美成人精品影院| 欧美成人中文字幕| 亚洲国内自拍| 99国产精品久久久| 亚洲欧美影音先锋| 欧美激情一区二区三区蜜桃视频| 欧美日韩视频在线第一区| 国产精品一卡二| 在线欧美影院| 亚洲欧美日韩网| 欧美大色视频| 亚洲欧美第一页| 欧美激情一区二区三区在线视频观看 | 久久久久高清| 亚洲国产精品高清久久久| 一区二区日韩免费看| 久久久精品2019中文字幕神马| 欧美精品国产一区| 精品成人国产在线观看男人呻吟| 亚洲最新在线视频| 欧美本精品男人aⅴ天堂| 亚洲校园激情| 欧美精品videossex性护士| 国产一级揄自揄精品视频| 在线午夜精品自拍| 欧美黄污视频| 亚洲人成亚洲人成在线观看| 亚洲欧美激情诱惑| 亚洲欧洲三级电影| 麻豆精品91| 国产综合色精品一区二区三区| 亚洲一区二区三区色| 91久久国产综合久久91精品网站| 久久福利视频导航| 国产精品久久婷婷六月丁香| 一本色道久久综合亚洲精品不卡| 欧美成人三级在线| 欧美在线看片| 国产日产欧美a一级在线| 亚洲小视频在线观看| 亚洲精品综合久久中文字幕| 欧美成人dvd在线视频| 亚洲电影免费观看高清| 久久久久99| 欧美亚洲在线| 国产日韩精品电影| 性做久久久久久久免费看| 一区二区三区www| 欧美日韩一区二区三区四区五区| 亚洲精品国产无天堂网2021| 亚洲成色777777女色窝| 农村妇女精品| 日韩视频免费观看高清完整版| 亚洲二区在线| 欧美另类变人与禽xxxxx| 亚洲人成在线观看一区二区| 亚洲国产精品日韩| 欧美另类99xxxxx| 亚洲一二三级电影| 亚洲伊人一本大道中文字幕| 国产精品专区h在线观看| 久久精彩视频| 另类成人小视频在线| 亚洲美女在线一区| 日韩一级免费| 国产美女一区| 欧美黑人国产人伦爽爽爽| 欧美精品亚洲精品| 亚洲欧美在线高清| 欧美专区亚洲专区| 亚洲靠逼com| 亚洲综合丁香| 亚洲国产你懂的| 9色精品在线| 韩国视频理论视频久久| 亚洲成在人线av| 国产精品美女在线观看| 久久综合中文字幕| 欧美日韩国产黄| 久久久久久午夜| 欧美日韩播放| 久久伊人亚洲| 欧美视频中文字幕在线| 乱中年女人伦av一区二区| 欧美日韩伦理在线| 久久在线视频在线| 欧美视频一区二区三区…| 欧美r片在线| 亚洲男人的天堂在线| 亚洲第一天堂无码专区| 洋洋av久久久久久久一区| 韩国av一区二区三区| 亚洲青涩在线| 红桃视频一区| 亚洲男人第一网站| 亚洲乱码国产乱码精品精| 欧美一区二区久久久| 在线亚洲欧美视频| 久久嫩草精品久久久精品| 午夜久久资源| 欧美日韩国产一级片| 欧美激情va永久在线播放| 国产情人节一区| 亚洲无线视频| 亚洲视频在线观看| 欧美激情视频一区二区三区在线播放| 久久免费99精品久久久久久| 国产精品美女一区二区| 日韩午夜一区| 99在线视频精品| 欧美激情精品久久久久久久变态| 久久一区国产| 悠悠资源网久久精品| 欧美专区一区二区三区| 性久久久久久| 国产精品一二一区| 亚洲欧美日韩一区在线| 亚洲欧美日韩网| 国产精品mv在线观看| 99re6这里只有精品| 在线性视频日韩欧美| 欧美日韩在线视频观看| 99国产精品视频免费观看一公开 | 黄色在线成人| 久久精品亚洲乱码伦伦中文| 久久女同精品一区二区| 国产一区亚洲| 久久久亚洲欧洲日产国码αv| 久久婷婷人人澡人人喊人人爽| 国产午夜精品全部视频播放| 欧美一区二区三区四区高清| 久久久精品网| 亚洲国产成人tv| 欧美黄色aaaa| 一区二区三区鲁丝不卡| 午夜精品久久久久久久男人的天堂| 国产精品va| 午夜亚洲精品| 欧美二区不卡| 亚洲视频一二| 国产无一区二区| 久久综合亚州| 日韩视频在线观看| 亚洲欧洲99久久| 黄色一区二区三区四区| 免费在线日韩av| 这里只有精品电影| 久久久亚洲成人| 亚洲美女淫视频| 国产麻豆91精品| 裸体歌舞表演一区二区| 亚洲精品国产无天堂网2021| 午夜伦理片一区| 亚洲丰满少妇videoshd| 欧美激情综合亚洲一二区| 一区二区免费在线视频| 久久久噜噜噜久久人人看| 欧美日韩精品欧美日韩精品一 | 久久一区激情| 99亚洲一区二区| 国产模特精品视频久久久久| 久久亚洲不卡| 亚洲午夜精品17c| 欧美大片在线看| 欧美一区二区网站| 亚洲精品黄网在线观看| 国产免费成人在线视频| 欧美国产丝袜视频| 欧美一区二区三区久久精品| 亚洲国产精品一区二区www| 香蕉免费一区二区三区在线观看| 一区精品在线播放| 国产精品av久久久久久麻豆网| 久久久久久香蕉网| 亚洲欧美日韩国产精品| 亚洲另类自拍| 亚洲成色777777在线观看影院| 欧美一级成年大片在线观看| 亚洲麻豆av| 在线日本欧美| 国产又爽又黄的激情精品视频 | 国产精品视频一区二区三区| 欧美成人激情视频免费观看| 先锋a资源在线看亚洲| 夜夜嗨网站十八久久| 欧美激情中文不卡| 老色批av在线精品| 久久久国产精品亚洲一区| 亚洲免费在线电影| 亚洲视频每日更新| 一区二区三区**美女毛片|