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

小四的海市蜃樓
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王其| 亚洲第一精品影视| 欧美日韩午夜在线| 欧美 日韩 国产在线| 玖玖玖国产精品| 蜜月aⅴ免费一区二区三区 | 亚洲第一在线综合网站| 欧美激情在线观看| 91久久国产精品91久久性色| 亚洲欧洲精品一区二区精品久久久| 亚洲国产毛片完整版| 一区二区三区国产| 午夜久久福利| 美女视频一区免费观看| 欧美日韩精品欧美日韩精品| 国产精品卡一卡二| 精品91视频| 日韩视频免费观看| 欧美一区二区私人影院日本| 久久夜色精品国产噜噜av| 亚洲成色999久久网站| 夜夜嗨网站十八久久| 久久不见久久见免费视频1| 免费在线看一区| 国产色爱av资源综合区| 一本一本久久| 你懂的网址国产 欧美| 亚洲视频二区| 欧美激情网友自拍| 久久久久久久欧美精品| 欧美日本不卡| 精品69视频一区二区三区| 亚洲特级毛片| 欧美黄免费看| 欧美在线观看视频| 欧美日韩国产色综合一二三四 | 久久精品成人| 国产精品qvod| 亚洲伦理中文字幕| 欧美 日韩 国产一区二区在线视频| 夜久久久久久| 欧美日本亚洲| 亚洲欧洲日本mm| 蜜桃av综合| 欧美一区二区高清| 欧美私人啪啪vps| 日韩视频一区二区在线观看| 免费亚洲一区二区| 久久精品日韩一区二区三区| 国产欧美日韩三级| 香蕉尹人综合在线观看| 9色精品在线| 欧美日韩国产综合在线| 亚洲免费大片| 亚洲高清av| 免费影视亚洲| 亚洲免费大片| 日韩一区二区精品视频| 欧美看片网站| 亚洲一区三区在线观看| 一区二区三区免费观看| 欧美视频精品在线观看| 亚洲视频999| 亚洲少妇在线| 国产日韩精品电影| 另类av一区二区| 免费影视亚洲| 亚洲图片激情小说| 亚洲免费在线视频| 狠色狠色综合久久| 亚洲大胆美女视频| 欧美日韩国产一区二区| 亚洲女同性videos| 欧美在线啊v一区| 亚洲国产成人不卡| 亚洲国产精品一区二区久| 欧美日韩成人一区二区三区| 亚洲永久精品大片| 亚洲在线一区二区三区| 国产日韩欧美在线观看| 开心色5月久久精品| 免费久久99精品国产自在现线 | 蜜桃av噜噜一区二区三区| 国产色婷婷国产综合在线理论片a| 一本一本久久a久久精品综合麻豆| 亚洲精品免费在线观看| 国产精品v欧美精品v日韩| 久久超碰97中文字幕| 久久久久久综合网天天| 亚洲精品资源| 香蕉av777xxx色综合一区| 亚洲电影免费观看高清完整版在线观看 | 亚洲伊人一本大道中文字幕| 亚洲影院一区| 国内精品一区二区三区| 欧美激情在线| 国产欧美日韩在线| 亚洲激情视频网站| 国产欧美日韩伦理| 亚洲韩日在线| 黄色国产精品一区二区三区| 99精品热6080yy久久| 亚洲丶国产丶欧美一区二区三区| 亚洲午夜高清视频| 亚洲精品综合在线| 久久久91精品国产| 亚洲女同精品视频| 欧美激情一区二区三区四区| 久久精品30| 国产精品激情av在线播放| 免费在线看一区| 国产日韩精品视频一区二区三区| 亚洲精品一品区二品区三品区| 黄色成人av在线| 欧美一级片久久久久久久| 亚洲午夜久久久久久尤物| 模特精品裸拍一区| 久久久人成影片一区二区三区 | 亚洲午夜91| 欧美成人情趣视频| 麻豆91精品| 韩国av一区二区三区四区| 亚洲一区综合| 亚洲综合国产精品| 欧美日韩在线免费| 亚洲高清视频的网址| 亚洲国产精品久久久久秋霞影院| 欧美一区二区三区电影在线观看| 亚洲一区中文字幕在线观看| 欧美精品免费在线| 亚洲大胆女人| 亚洲日韩欧美视频一区| 久久综合给合久久狠狠狠97色69| 久久福利电影| 国产视频欧美视频| 欧美一区二区成人| 另类图片综合电影| 亚洲国产精品欧美一二99| 久久伊伊香蕉| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲欧美日韩在线高清直播| 欧美经典一区二区三区| 91久久精品国产91久久性色tv| 在线激情影院一区| 麻豆精品一区二区综合av | 欧美激情精品久久久久久蜜臀| 在线免费观看日韩欧美| 欧美在线观看网站| 久久综合色婷婷| 亚洲高清久久网| 欧美精品1区2区| 国产精品99久久久久久久久久久久 | 亚洲嫩草精品久久| 久久精品国产第一区二区三区最新章节| 国产日韩欧美在线播放不卡| 久久9热精品视频| 欧美高清视频一区| 亚洲一区二区在线免费观看| 国产伦精品免费视频| 久久久99国产精品免费| 欧美激情一区二区三区在线视频观看 | 亚洲精品黄色| 欧美日本不卡视频| 亚洲欧美日韩在线播放| 久久综合狠狠综合久久激情| 91久久精品久久国产性色也91| 欧美黄色视屏| 亚洲女优在线| 亚洲国产高清在线| 亚洲综合电影| 亚洲国产欧美在线| 国产精品二区在线观看| 久久久精品日韩| 亚洲三级免费| 久久久久久穴| 亚洲午夜国产一区99re久久| 国产综合在线看| 欧美日韩亚洲国产精品| 久久久精品国产免大香伊 | 欧美在线看片a免费观看| 亚洲大胆美女视频| 国产精品久久久久77777| 久久婷婷蜜乳一本欲蜜臀| 一本久道久久综合狠狠爱| 浪潮色综合久久天堂| 亚洲一区二区三区久久| 伊人久久亚洲热| 国产精品一区免费观看| 欧美另类极品videosbest最新版本| 性欧美xxxx大乳国产app| 99国产精品久久| 亚洲第一天堂av| 老司机成人网| 欧美在线影院在线视频| 国产精品伊人日日| 日韩视频在线免费观看| 麻豆国产精品777777在线| 欧美一区二区在线免费播放| 99热在这里有精品免费| 亚洲高清视频在线观看|