嵌入式

编程与应用
posts - 14, comments - 1, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

 

#ifndef LINKEDSTACK_CLASS
#define LINKEDSTACK_CLASS
template 
<class T> class LinkedStack;
template 
<class T>

class Node
{
    
private:
        T elements;
        Node
<T> *link;
        friend 
class LinkedStack<T>;
}
;

template 
<class T>
class LinkedStack

  
public:
    LinkedStack()
{top=NULL;}
    
~LinkedStack();
    
bool IsEmpty() const return top==NULL; }
    T Top() 
const;
    
bool Push(T x);
    
bool Pop();
    
void Clear();
  
private:                                  
    Node
<T> *top; 
}
;

#endif//LINKEDSTACK_CLASS

static int isp(char optr);
    
static int icp(char optr);
template 
<class T>
LinkedStack
<T>::~LinkedStack()
{
    Node
<T>* p=top;
    
while(p)
    
{
        p
=top->link;
        delete top;
        top
=p;
    }

}


template 
<class T>
T LinkedStack
<T>::Top() const

    
return top->elements;
}


template 
<class T>
bool LinkedStack<T>::Push(T x)

   Node
<T>* p=new Node<T>;
   p
->elements=x;
   p
->link=top;
   top
=p;//cout<<top->elements<<" ";
   return true;
}


template 
<class T>
bool LinkedStack<T>::Pop()

    
if(IsEmpty()){                                  //空栈处理
        cout<<"Underflow"<<endl;   return false;
    }

    Node
<T>* p;
   p
=top->link;delete top;top=p; return true;
}


template 
<class T>
void LinkedStack<T>::Clear()
{
    Node
<T>* p=top;
    
while(p)
    
{
        p
=top->link;
        delete top;
        top
=p;
    }

}


#ifndef CALCULATOR_CLASS
#define CALCULATOR_CLASS

#include
<iostream>
using namespace std;
#include
"LinkedStack.h"

class Calculator
{
private:
    
static int isp(char optr);
    
static int icp(char optr);
    
static LinkedStack<float> s;
    
static LinkedStack<char> cs;
    
static void DoOperator(char oper);
public:
    
static void Run();
}
;


#endif//CALCULATOR_CLASS


#include
"Calculator.h"

LinkedStack
<char> Calculator::cs;
LinkedStack
<float> Calculator::s;

int Calculator::isp(char optr) 

    
switch (optr) 
    

    
case '='return 0
    
case '('return 1
    
case '^'return 7
    
case '*'return 5
    
case '/'return 5
    
case '%'return 5
    
case '+'return 3
    
case '-'return 3
    
case ')'return 8
    
defaultreturn 0
    }
 
}
 

int Calculator::icp(char optr) 

    
switch (optr)
    
{
    
case '='return 0
    
case '('return 8
    
case '^'return 6
    
case '*'return 4
    
case '/'return 4
    
case '%'return 4
    
case '+'return 2
    
case '-'return 2
    
case ')'return 1
    
defaultreturn 0
    }
 
}
 
void Calculator::DoOperator(char oper)
{
    
float oper1,oper2;
    oper1
=Calculator::s.Top();
    Calculator::s.Pop();
    oper2
=Calculator::s.Top();
    Calculator::s.Pop();
    
switch(oper)
    
{
        
case '+':Calculator::s.Push(oper2+oper1);break;
        
case '-':Calculator::s.Push(oper2-oper1);break;
        
case '*':Calculator::s.Push(oper2*oper1);break;
        
case '/':Calculator::s.Push(oper2/oper1);break;
    }

}


void Calculator::Run()
{
    
char c;float newop;char y;
    Calculator::cs.Push(
'=');
    
while(cin>>c,c!='=')
        
//if(c!='+'&&c!='-'&&c!='*'&&c!='/')
        if(isdigit(c)||isalpha(c))
        
{
            cin.putback(c);cin
>>newop;
            Calculator::s.Push(newop);
        }

        
else if(c==')')
            
for(y=Calculator::cs.Top(),Calculator::cs.Pop();y!='(';y=Calculator::cs.Top(),Calculator::cs.Pop())
                Calculator::DoOperator(y);
        
else
        
{
            
for(y=Calculator::cs.Top(),Calculator::cs.Pop();icp(c)<=isp(y);y=Calculator::cs.Top(),Calculator::cs.Pop())
                DoOperator(y);
            Calculator::cs.Push(y);Calculator::cs.Push(c);
        }

    }

    
while(!cs.IsEmpty()){
        y
=Calculator::cs.Top();
        Calculator::cs.Pop();
        
if(y!='=')
            DoOperator(y);
    }

    cout
<<Calculator::s.Top();
}


#include
"Calculator.h"

int main()
{
    Calculator::Run();
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理