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

小四的海市蜃樓
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 小四 閱讀(717) 評論(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下载红粉| 亚洲第一黄色| 最新亚洲视频| 老司机精品导航| 美国成人直播| 黄色精品一二区| 久久久成人网| 久热精品在线视频| 国内揄拍国内精品久久| 亚洲综合欧美日韩| 欧美在线视频全部完| 国产精品美女www爽爽爽视频| 99在线|亚洲一区二区| 亚洲欧洲午夜| 欧美精品情趣视频| 亚洲精品一区二| 亚洲视频在线观看一区| 欧美三级黄美女| 在线亚洲精品| 欧美一区深夜视频| 国产婷婷一区二区| 久久国产夜色精品鲁鲁99| 久久久综合激的五月天| 国内久久精品视频| 久久亚洲图片| 亚洲激情在线视频| 亚洲午夜久久久| 国产精品视频yy9299一区| 中日韩美女免费视频网址在线观看| 一区二区三区蜜桃网| 欧美三级视频在线| 亚洲一区二区三区中文字幕| 欧美一级视频精品观看| 国产伦精品一区二区三区视频孕妇 | 亚洲天堂成人在线视频| 欧美三级电影网| 午夜精品久久久久久99热软件| 久久精品国产第一区二区三区最新章节| 国产三级精品三级| 免费欧美电影| 一区二区三欧美| 久久美女性网| 亚洲精品字幕| 国产欧美一区二区白浆黑人| 久久全国免费视频| 99精品久久| 久久亚洲精品视频| 一区二区三区高清不卡| 国产色综合久久| 免费黄网站欧美| 亚洲午夜精品一区二区| 蜜臀久久99精品久久久久久9| 艳女tv在线观看国产一区| 国产精品日韩在线| 欧美xart系列高清| 性色av一区二区三区在线观看| 欧美成人嫩草网站| 久久爱另类一区二区小说| 亚洲国产日韩综合一区| 国产精品久久久久久久久久妞妞| 久久综合给合久久狠狠色| 中文网丁香综合网| 欧美激情一区二区三区在线| 欧美亚洲日本一区| 一区二区国产在线观看| 亚洲成色www久久网站| 欧美午夜精品久久久久久孕妇| 久久爱www| 亚洲午夜影视影院在线观看| 欧美激情2020午夜免费观看| 欧美有码在线视频| 亚洲少妇一区| 亚洲看片网站| 亚洲国产一区二区三区高清| 国产亚洲aⅴaaaaaa毛片| 欧美日精品一区视频| 欧美激情女人20p| 免费看的黄色欧美网站| 久久久久久9999| 欧美一区二区三区在线观看视频| 一区二区三区 在线观看视频| 欧美电影免费观看网站| 久久免费国产精品| 欧美一区二区三区在线观看| 中文亚洲字幕| 中国成人在线视频| 99国产精品久久久久老师 | 99天天综合性| 亚洲国产婷婷综合在线精品| 狠狠色狠狠色综合系列| 国产欧美日韩在线| 国产精品视频免费在线观看| 欧美日韩在线免费| 欧美日韩亚洲在线| 欧美日韩系列| 欧美日韩在线免费| 欧美日韩亚洲天堂| 欧美日韩在线亚洲一区蜜芽| 欧美另类高清视频在线| 欧美日韩mp4| 欧美丝袜一区二区三区| 欧美视频在线观看 亚洲欧| 欧美激情一区二区三区在线| 欧美黄免费看| 欧美少妇一区二区| 国产精品久久久久影院色老大 | 国语精品中文字幕| 狠狠色丁香婷婷综合影院| 韩日视频一区| 亚洲人成绝费网站色www| 亚洲欧洲在线一区| aⅴ色国产欧美| 午夜精品一区二区三区四区| 欧美一级黄色录像| 麻豆成人在线| 亚洲国产欧美不卡在线观看| 亚洲三级国产| 亚洲小说春色综合另类电影| 欧美一区二区三区四区在线| 久久久午夜电影| 欧美韩日亚洲| 国产精品一区二区男女羞羞无遮挡| 国产伦理一区| 亚洲国产日韩美| 亚洲欧美国产va在线影院| 久久爱另类一区二区小说| 欧美成人一区在线| 一区二区三区高清| 久久久99久久精品女同性 | 久久人人97超碰人人澡爱香蕉| 欧美大成色www永久网站婷| 欧美日韩亚洲综合| 激情综合电影网| 亚洲深夜福利视频| 老司机精品福利视频| 亚洲日本免费| 久久国内精品视频| 久久综合狠狠| 亚洲最新色图| 狼人天天伊人久久| 国产精品国产馆在线真实露脸 | 一区在线观看| 国产精品99久久久久久有的能看| 久久久国际精品| 日韩亚洲精品视频| 久久精品综合网| 国产精品毛片在线| 日韩亚洲视频| 乱人伦精品视频在线观看| 一区二区三区国产在线观看| 免费短视频成人日韩| 国产精品一区二区欧美| a91a精品视频在线观看| 免费亚洲电影在线观看| 亚洲欧美中文日韩在线| 欧美日韩一区二区三区四区在线观看| 黄色影院成人| 久久精品日韩一区二区三区| 日韩五码在线| 欧美激情第三页| 在线观看国产精品网站| 久久九九国产| 亚洲欧美日韩国产综合| 欧美午夜欧美| aa亚洲婷婷| 91久久精品国产91久久性色| 久久全国免费视频| 今天的高清视频免费播放成人| 亚洲欧美高清| 亚洲图片欧洲图片日韩av| 欧美精品一区在线| 亚洲国产婷婷香蕉久久久久久99| 久久深夜福利免费观看| 欧美一区二区三区免费大片| 国产精品一区久久| 欧美一区=区| 亚洲桃色在线一区| 国产精品久久国产精麻豆99网站| 一区二区欧美日韩| 日韩亚洲欧美中文三级| 欧美日韩调教| 亚洲欧美日韩高清| 亚洲永久在线| 国产日韩精品电影| 久久久国产精品一区| 久久精品视频99| 亚洲成色www8888| 亚洲高清激情| 欧美日韩国产美女|