zoukankan      html  css  js  c++  java
  • 简单的计算器

    http://www.zhihu.com/question/28049221

    这里有个问题说:

    能用c语言编写一个简单的计算器,包含加减乘以及括号之间的优先级关系,这样的编程能力算是什么程度?

    我也很好奇,能写出来到底怎么样。我写出的代码到底怎么样。便有了下面的代码。

    毕竟是好久没有写这些小程序了。

    #include <iostream>
    #include <stack>
    #include <map>
    using namespace std;
    
    //get a number from a string["123nc14"==>123]
    bool getNumber(char* input,int& number,int& strMoveOffset)
    {
        strMoveOffset = 0;
        while(input[strMoveOffset]>=48
            &&input[strMoveOffset]<58)//this char is a number
        {
            strMoveOffset++;    
        }    
        if(!strMoveOffset)//this char is a operator
        {
            return false;
        }
        //parse the number
        number = atoi(input);
        return true;
    };
    
    int main(int argc,char** argv)
    {
        //string for input
        char input[256];
        //number stack and operator stack
        stack<int> NumStack;
        stack<char> OperatorStack;
        //hashtable for operators' priority
        map<char,int> operatorPriority;
        operatorPriority['+']=1;
        operatorPriority['-']=1;
        operatorPriority['*']=2;
        operatorPriority['/']=2;
        operatorPriority['(']=3;
        operatorPriority[')']=0;
        operatorPriority['']=-1;
        
        std::cin.getline(input,256);
        std::cout<<input<<std::endl;
        char* ptr = input;
        int strOffset = 0;
        int number;
        while(true)
        {
            if(getNumber(ptr,number,strOffset))
            {
                //we got a number
                NumStack.push(number);    
            }
            else
            {
                //we got an operator
                
                char curOp = ptr[0];
                //now for calculating
                
                //if we have operator in the stack and current char own higher priority 
                // than the top operator in the stack
                //and ignore '(' in order to avoid this case[2*(3+4)==>  23  *(+ perform2(3??]
                if(OperatorStack.size()>0&&operatorPriority[OperatorStack.top()]>=
                    operatorPriority[curOp]&&OperatorStack.top()!='(')
                {
                    while(OperatorStack.size()>0&&operatorPriority[OperatorStack.top()]>=
                    operatorPriority[curOp])
                    {
                        //perform this calculation
                        int number1,number2;
                        
                        if(OperatorStack.top() == '(')
                        {
                            //ignore this case.just pop it
                        }
                        else 
                        {
                            number2 = NumStack.top();NumStack.pop();
                            number1 = NumStack.top();NumStack.pop();
                            
                            switch(OperatorStack.top())
                            {
                                case '+':
                                    NumStack.push(number2+number1);
                                break;
                                case '-':
                                    NumStack.push(number1-number2);
                                break;
                                case '*':
                                    NumStack.push(number2*number1);
                                break;
                                case '/':
                                    NumStack.push(number1/number2);
                                break;
                            }
                        }
                        OperatorStack.pop();//remove this operator
                    }
                    
                    OperatorStack.push(curOp);//add next new operator
                }
                else
                //push it if nothing happended
                    OperatorStack.push(ptr[0]);
                    
                ptr+=1;
            }
            
            if(ptr[0]=='')
            break;
            
            ptr+=strOffset;
        }
        
        //output result
        std::cout<<NumStack.top()<<std::endl;
        //test
        //int k = atoi("12*(");
        //std::cout<<k<<std::endl;
        return 0;
    }
  • 相关阅读:
    利用EZMorph复制bean
    JAVA中使用FTPClient上传下载
    戏说java web开发中的listener和filter
    FastCGI的并发处理
    XPATH学习总结
    [Linux] gdb crash之后,杀掉僵尸进程的办法
    JAVA反射使用手记
    在centos5下安装配置VNC
    开始FastCGI
    log4php配置文件实例
  • 原文地址:https://www.cnblogs.com/kalluwa/p/4281970.html
Copyright © 2011-2022 走看看