c++实现表达式计算问题

#include <iostream>

#include <Windows.h>

#include <string>

using namespace std;

//栈的定义

template<class T>

struct Node

{

T data;

Node *next;

};

template<class T>

class LinkStack

{

public:

LinkStack();

~LinkStack();

T & GetTop();//获取栈顶元素

bool Empty();//判断栈是否为空

void Push(T);

T Pop();

void Clear();

const int Length();

private:

Node<T> *head;

int length;

};

template<class T>

LinkStack<T>::LinkStack()

{

length = 0;

head = NULL;

}

template<class T>

void LinkStack<T>::Push(T data)

{

Node<T> *p = new Node<T>

p->data = data;

p->next = head;

head = p;

length ++;

}

template<class T>

T & LinkStack<T>::GetTop()

{

if(length < 0)

{

cout << "栈为空" << endl;

exit(0);

}

return head->data;

}

template<class T>

bool LinkStack<T>::Empty()

{

if (length == 0)

return true;

else

return false;

}

template<class T>

T LinkStack<T>::Pop()

{

if (length < 0)

{

cout << "栈为空" << endl;

exit(0);

}

T e = head->data;

head = head->next;

length --;

return e;

}

template<class T>

void LinkStack<T>::Clear()

{

Node<T> *p = head;

while(p != NULL)

{

p = p->next;

delete head;

head = p;

}

head = NULL;

length = 0;

}

template<class T>

const int LinkStack<T>::Length()

{

return length;

}

template<class T>

LinkStack<T>::~LinkStack()

{

Clear();

//cout << "析构" << endl;

}

//栈外优先级

const int isw(const char &e)

{

int i = 0;

switch(e)

{

case '+':

case '-':i = 2;break;

case '*':

case '/':i = 3;break;

case '(':i = 5;break;

case '#':i = 0;break;

}

return i;

}

//栈内优先级

const int isn(const char &e)

{

int i = 0;

switch(e)

{

case '+':

case '-':i = 2;break;

case '*':

case '/':i = 3;break;

case '(':i = 0;break;

case '#':i = 0;break;

}

return i;

}

LinkStack<double> figure;//存放数字

void Calcalate(const char &oper)

{

double num1 = 0,num2 = 0;

num1 = figure.Pop();

num2 = figure.Pop();

switch(oper)

{

case '+':

figure.Push( num1+num2 );

break;

case '-':

figure.Push( num2 - num1 );

break;

case '*':

figure.Push( num1 * num2 );

break;

case '/':

if (num1 != 0)

{

figure.Push( num2/num1 );

}

else

{

cout << "出错,除数不能为 0 !" << endl;

exit(-1);

}

break;

}

}

void ReadData()

{

LinkStack<char> mark;

mark.Push('#');

char c, getMark;

string digit_str = "";

cout << "请输入表达式,以输入 # 结束" << endl;

cin >> c;

while(c != '#')

{

getMark = mark.GetTop();

while ((c >= '0' && c <= '9') || c == '.')

{

digit_str += c;

cin >> c;

if ((c < '0' || c > '9') && c != '.')

{

figure.Push

( atof( digit_str.c_str() ) );//把字符数字转变成double型数字,后放入figure栈中

digit_str = "";

}

}

if (c == '#')

{

break;

}

else if (c == ')')

{

while(getMark != '(')

{

Calcalate( mark.Pop() );//调用Calcalate函数,进行计算

getMark = mark.GetTop();

}

mark.Pop();//把左括号( 扔出栈

}

else

{

while (isn(getMark) >= isw(c))

{

Calcalate( mark.Pop() );

getMark = mark.GetTop();

}

mark.Push(c);

}

cin >> c;

}

while( mark.Length() > 1)//排除#号,所以循环次数要大于1

{

Calcalate( mark.Pop() );

}

}

int main()

{

ReadData();

cout << "result = " << figure.Pop() << endl;

return 0;

} 

猜你喜欢

转载自blog.csdn.net/loved_computer/article/details/78821981