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

小四的海市蜃樓
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>
            在线综合视频| 欧美一区二区成人6969| 欧美激情性爽国产精品17p| 亚洲淫性视频| 亚洲在线一区二区三区| 久久精品亚洲一区| 欧美视频在线视频| 一区二区三区亚洲| 嫩草国产精品入口| 亚洲欧美日韩国产一区二区| 久久亚洲影院| 一二三区精品福利视频| 亚洲精品乱码久久久久久按摩观 | 亚洲最快最全在线视频| 欧美国产日韩一区二区在线观看| 亚洲欧美日韩国产一区| 亚洲性视频网址| 亚洲欧美一级二级三级| 欧美高清不卡在线| 伊人激情综合| 日韩一区二区精品葵司在线| 亚洲精品中文字| 国产欧美综合一区二区三区| 日韩一区二区电影网| 99天天综合性| 欧美亚洲日本国产| 国产精品视频导航| 欧美黄色小视频| 老司机一区二区| 亚洲欧美视频在线观看| 91久久精品国产91性色tv| 久久aⅴ国产紧身牛仔裤| 久久久久国产成人精品亚洲午夜| 欧美日韩精品免费| 久久蜜桃精品| 久久久精品一品道一区| 久久久久国产一区二区三区| 欧美99在线视频观看| 精品白丝av| 一区二区三区国产在线| 欧美成人资源| 一本一本久久a久久精品牛牛影视| 一区二区三区色| 久久综合给合| 亚洲精品小视频在线观看| 亚洲视频www| 久久久综合精品| 91久久综合| 亚洲激情在线观看| 国内精品视频666| 一区二区三区精品久久久| 国产精品久久77777| 亚洲欧美成人| 欧美日韩亚洲高清| 亚洲人成网站色ww在线| 欧美日韩成人免费| 午夜国产精品视频| 欧美精品一区二区三区蜜桃 | 国产精品每日更新在线播放网址| 国产亚洲成人一区| 一区二区三区www| 一本久久综合亚洲鲁鲁五月天| 亚洲乱码国产乱码精品精98午夜| 欧美一区视频| 久久久久久高潮国产精品视| 久久久久久色| 久久在线视频在线| 一区二区三区在线观看视频 | 亚洲精选91| 免费亚洲一区| 亚洲国产精品久久久| 久久精品国产综合精品| 亚洲精品日韩激情在线电影| 久久久91精品国产| 国产一区清纯| 毛片av中文字幕一区二区| 亚洲午夜激情网页| 欧美亚洲一区二区在线观看| 亚洲激情影视| 香蕉尹人综合在线观看| 亚洲经典在线| 欧美日韩国产综合视频在线观看 | 亚洲主播在线| 国产精品久久久久9999| 在线视频欧美一区| 久久久亚洲高清| 亚洲黄网站在线观看| 国产日韩欧美夫妻视频在线观看| 亚洲欧美国产另类| 国产欧美日韩综合一区在线播放 | 久久综合影视| 亚洲欧洲一二三| 国产精品播放| 久久久久看片| 一区二区激情小说| 久久亚洲视频| 国产精品乱子久久久久| 亚洲欧美日韩天堂一区二区| 免费成人av在线看| 久久久综合香蕉尹人综合网| 久久成人国产| 久久精品国产亚洲一区二区三区| 欧美3dxxxxhd| 欧美不卡激情三级在线观看| 欧美成人xxx| 亚洲成人在线视频播放| 精品成人国产| 亚洲一区在线播放| 欧美第一黄网免费网站| 欧美激情视频免费观看| 亚洲无亚洲人成网站77777| 一区二区免费看| 亚洲午夜羞羞片| 黄色在线一区| 国产精品久久久久久久久借妻| 日韩视频免费观看高清在线视频 | 欧美日韩一区二区在线| 亚洲制服丝袜在线| 国产精品国产三级国产专区53| 欧美一区二区精美| 一个色综合av| 国产精品h在线观看| 91久久精品国产91性色| 国产欧美日韩另类视频免费观看| 妖精成人www高清在线观看| 国产一区二区中文| 国产精品v日韩精品| 一区二区三区四区在线| 亚洲自拍偷拍视频| 国产欧美一区二区白浆黑人| 亚洲欧美在线视频观看| 亚洲精品一区二区在线| 欧美国产视频在线| 久热成人在线视频| 久久精品国产久精国产思思| 久久亚洲欧美国产精品乐播| 欧美日韩亚洲一区三区| 另类综合日韩欧美亚洲| 欧美色综合网| 欧美精品色一区二区三区| 99视频有精品| 亚洲精品日日夜夜| 亚洲日韩视频| 欧美在线影院| 亚洲精品国精品久久99热| 欧美国产精品v| 欧美大胆人体视频| 亚洲专区一二三| 欧美成人免费va影院高清| 亚洲麻豆av| 国产麻豆9l精品三级站| 99精品视频免费在线观看| 欧美亚洲日本国产| 亚洲国产欧美一区二区三区久久| 中文日韩在线视频| 猛男gaygay欧美视频| 亚洲看片网站| 狠狠色综合网站久久久久久久| 欧美1区免费| 欧美一区精品| 日韩午夜一区| 亚洲欧美电影在线观看| 亚洲福利免费| 老牛影视一区二区三区| av72成人在线| 一区二区亚洲精品国产| 欧美色中文字幕| 欧美成人精品1314www| 嫩草影视亚洲| 亚洲精品一区二区三区在线观看| 亚洲精品裸体| 亚洲天堂免费观看| 久久国产精品久久久久久| 亚洲人成在线播放| 一区二区日韩免费看| 欧美久久久久久久久久| 久久久91精品国产一区二区三区| 久久久免费精品| 亚洲国产女人aaa毛片在线| 欧美在线www| 亚洲国产精品va在线观看黑人| 久久久久久尹人网香蕉| 亚洲欧美日韩国产一区二区| 亚洲精品一区二区三| 一色屋精品亚洲香蕉网站| 国产精品视频网站| 亚洲国产第一页| 欧美一区二区三区精品电影| 国产精品99久久久久久人| 国产精品视频网站| 亚洲激情在线激情| 亚洲国产成人在线播放| 韩日成人在线| 在线观看欧美日本| 亚洲一区二区精品在线| 国产午夜精品视频免费不卡69堂| 国产精品一区二区三区久久| 欧美视频一区二区三区在线观看| 午夜精品久久久久久久99热浪潮| 亚洲视频精选|