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

小四的海市蜃樓
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导航| 亚洲欧美综合一区| 国产精品区一区| 亚洲电影免费观看高清完整版在线观看 | 亚洲欧美日本国产专区一区| 久久久久久网| 欧美中文字幕在线视频| 欧美日韩国产在线观看| 欧美成人xxx| 国产在线视频不卡二| 亚洲手机在线| 亚洲视频一区在线观看| 免费国产一区二区| 久久全国免费视频| 国产欧美一区二区三区在线老狼| 亚洲欧洲综合另类在线| 狠狠色噜噜狠狠狠狠色吗综合| 一区二区三区国产精品| 一区二区三区视频在线| 欧美成人一区二免费视频软件| 久久久久久久一区二区三区| 国产精品久久激情| 99国产精品久久久| 一区二区三区偷拍| 欧美日韩一区精品| 亚洲美女视频在线观看| 亚洲免费成人| 欧美精品成人| 亚洲三级毛片| 一区二区电影免费观看| 欧美日韩国产一区二区三区| 亚洲精品午夜精品| 中文在线资源观看网站视频免费不卡 | 国产精品国产a级| 一区二区三区日韩欧美| 亚洲专区欧美专区| 国产精品视频区| 午夜久久福利| 久久综合狠狠综合久久综青草| 国产亚洲视频在线| 久久久久成人网| 欧美a级一区二区| 亚洲区中文字幕| 欧美日本韩国一区| 亚洲一区二区成人| 久久久天天操| 亚洲精品久久久久久一区二区| 欧美另类综合| 亚洲欧美资源在线| 欧美成人免费一级人片100| 最新热久久免费视频| 欧美日韩一区二区精品| 亚洲男女毛片无遮挡| 久久午夜精品| 一本综合精品| 国产亚洲一区二区三区| 蜜臀av一级做a爰片久久| 亚洲美女性视频| 久久国产精品99精品国产| 在线观看91久久久久久| 欧美日韩一区二区在线观看| 欧美一区二区性| 亚洲日本成人网| 久久国产精品72免费观看| 亚洲精品久久7777| 国产视频在线观看一区二区三区| 玖玖玖国产精品| 亚洲小说区图片区| 欧美国产日韩a欧美在线观看| 亚洲一区二区三区色| 又紧又大又爽精品一区二区| 欧美日韩国内| 久久久久久久久久看片| 一本色道久久加勒比88综合| 美女啪啪无遮挡免费久久网站| 99亚洲精品| 亚洲大胆在线| 国产伦一区二区三区色一情| 欧美寡妇偷汉性猛交| 久久av二区| 亚洲手机成人高清视频| 亚洲激情网站免费观看| 麻豆av一区二区三区久久| 亚洲免费视频在线观看| 最新中文字幕亚洲| 国产综合在线看| 国产精品久久午夜| 欧美成人激情视频| 久久久久久久一区二区| 亚洲欧美激情视频| 亚洲免费精品| 91久久精品一区二区别| 玖玖综合伊人| 久久久福利视频| 欧美一区二区在线| 亚洲欧美色婷婷| 亚洲一区二区3| 正在播放亚洲| 99这里只有久久精品视频| 亚洲国产日韩一级| 1000部精品久久久久久久久| 国产一区二区三区高清在线观看| 国产精品免费看| 国产精品久久久久影院亚瑟| 欧美三级在线播放| 欧美三级乱人伦电影| 欧美日韩中文字幕在线| 欧美日韩视频在线| 欧美日韩精品一区二区天天拍小说 | 免费欧美在线| 嫩模写真一区二区三区三州| 葵司免费一区二区三区四区五区| 久久精品女人天堂| 老司机午夜精品视频| 毛片基地黄久久久久久天堂| 久久久久五月天| 欧美成人免费va影院高清| 欧美电影免费网站| 亚洲高清自拍| 亚洲免费不卡| 亚洲一区www| 午夜在线不卡| 久久看片网站| 女仆av观看一区| 欧美日韩精品免费看| 欧美系列精品| 国模大胆一区二区三区| 在线成人小视频| 一区二区三区三区在线| 午夜精品久久久久久久蜜桃app | 欧美亚洲综合在线| 久久久久久亚洲精品中文字幕| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲在线电影| 久久资源av| 亚洲视频你懂的| 久久影视三级福利片| 榴莲视频成人在线观看| 欧美高清在线一区| 国产精品高潮视频| 极品少妇一区二区三区| 亚洲狼人精品一区二区三区| 亚洲一区免费| 免费成人高清视频| 亚洲麻豆av| 久久精品一本| 欧美美女视频| 国产综合自拍| 一区二区三区蜜桃网| 欧美一区二区在线看| 欧美高清视频一二三区| 亚洲男人第一av网站| 麻豆91精品91久久久的内涵| 欧美视频导航| 亚洲国产美国国产综合一区二区| 亚洲视频你懂的| 亚洲国产精彩中文乱码av在线播放| 国产日韩欧美精品| 欧美午夜宅男影院在线观看| 影院欧美亚洲| 亚洲欧美另类综合偷拍| 欧美国产精品中文字幕| 亚洲欧美日韩精品一区二区| 欧美激情小视频| 一区在线电影| 久久av二区| 妖精成人www高清在线观看| 久久久97精品| 国产欧美精品va在线观看| 亚洲视频图片小说| 欧美国产视频一区二区| 久久av红桃一区二区小说| 国产精品日日做人人爱| 99精品欧美一区| 女主播福利一区| 欧美中文字幕| 国产欧美日韩激情| 亚洲欧美日韩在线高清直播| 亚洲蜜桃精久久久久久久| 欧美r片在线| 在线精品视频免费观看| 久久视频国产精品免费视频在线| 一区二区三区蜜桃网| 欧美日韩精品一区二区在线播放| 亚洲人成7777| 亚洲高清免费在线| 麻豆免费精品视频| 在线观看91精品国产入口| 老巨人导航500精品| 久久成人精品一区二区三区| 国产丝袜一区二区三区| 久久九九精品| 久久久综合网| 伊人色综合久久天天| 蜜桃久久av一区| 老司机精品久久| 亚洲日韩欧美视频| 亚洲美女黄网| 国产精品豆花视频| 欧美一区二区|