求助数据结构算法编辑:按常规形式输入算术表达式(例如:输入2*(6-4)+8/4),要求能够:

(1)生成表达式的后缀表示,并输出;(2)生成表达式的前缀表示,并输出;(3)基于表达式的后缀表示,对该表达式求值;(4)编写一个主程序对表达式求值函数进行测试。... (1)生成表达式的后缀表示,并输出;(2)生成表达式的前缀表示,并输出;(3)基于表达式的后缀表示,对该表达式求值; (4)编写一个主程序对表达式求值函数进行测试。 展开
 我来答
zhjiemm
2012-04-14 · TA获得超过2643个赞
知道大有可为答主
回答量:1834
采纳率:75%
帮助的人:700万
展开全部

#include<iostream>

#include <vector>

using namespace std;

/***********************  栈操作  ************************/

/*********************************************************/

const int MAXSIZE =100;  

template <class ElemType> class MyStack  

{  

public:  

    ElemType data[MAXSIZE];  

    int top;  

  

public:  

    void init();            // 初始化栈   

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

    ElemType gettop();      // 读取栈顶元素(不出栈)   

    void push(ElemType x);  // 进栈   

    ElemType pop();         // 出栈   

};  

  

  

template<class T> void MyStack<T>::init()  

{  

    this->top = 0;  

}  

  

template<class T> bool MyStack<T>::empty()  

{  

    return this->top == 0? true : false;  

}  

  

template<class T> T MyStack<T>::gettop()  

{  

    if(empty())  

    {  

        cout << "栈为空!\n";  

        exit(1);  

    }  

    return this->data[this->top-1];  

}  

  

template<class T> void MyStack<T>::push(T x)  

{  

    if(this->top == MAXSIZE)  

    {  

        cout << "栈已满!\n";  

        exit(1);  

    }  

    this->data[this->top] =x;  

    this->top ++;  

}  

  

template<class T> T MyStack<T>::pop()  

{  

    if(this->empty())  

    {  

        cout << "栈为空! \n";  

        exit(1);  

    }  

  

    T e =this->data[this->top-1];  

    this->top --;  

    return e;  

}  

/***********************  函数声明  ************************/

bool isoperator(char op);                         // 判断是否为运算符   

int priority(char op);                            // 求运算符优先级   

void postfix(char pre[] , char post[],int &n);    // 把中缀表达式转换为后缀表达式   

double read_number(char str[],int *i);            // 将数字字符串转变成相应的数字   

double postfix_value(char post[]);                // 由后缀表达式字符串计算相应的中值表达式的值    

/*********************************************************/

double read_number(char str[],int *i)  

{  

    double x=0.0;  

    int k = 0;  

    while(str[*i] >='0' && str[*i]<='9')  // 处理整数部分   

    {  

        x = x*10+(str[*i]-'0');  

        (*i)++;  

    }  

  

    if(str[*i]=='.') // 处理小数部分   

    {  

        (*i)++;  

        while(str[*i] >= '0'&&str[*i] <='9')  

        {  

            x = x * 10 + (str[*i]-'0');  

            (*i)++;  

            k++;  

        }  

    }  

    while(k!=0)  

    {  

        x /= 10.0;  

        k--;  

    }  

  

    return x;  

}  

// 把中缀表达式转换为后缀表达式,返回后缀表达式的长度(包括空格)

void postfix(char pre[] ,char post[],int &n)

{

int i = 0 ,j=0;

MyStack<char> stack;    

stack.init();   // 初始化存储操作符的栈

stack.push('#'); // 首先把结束标志‘#’放入栈底

while(pre[i]!='#')

{

   if((pre[i]>='0' && pre[i] <='9')||pre[i] =='.') // 遇到数字和小数点直接写入后缀表达式

   {

    post[j++] = pre[i];

    n++;

   }

   else if (pre[i]=='(') // 遇到“(”不用比较直接入栈

    stack.push(pre[i]);

   else if(pre[i] ==')') // 遇到右括号将其对应左括号后的操作符(操作符栈中的)全部写入后缀表达式

   {

    while(stack.gettop()!='(')

    {

     post[j++] = stack.pop();

     n++;

    }

    stack.pop(); // 将“(”出栈,后缀表达式中不含小括号

   }

   else if (isoperator(pre[i]))

   {

    post[j++] = ' '; // 用空格分开操作数(

    n++;

    while(priority(pre[i]) <= priority(stack.gettop())) 

    {

     // 当前的操作符小于等于栈顶操作符的优先级时,将栈顶操作符写入到后缀表达式,重复此过程

     post[j++] = stack.pop();

     n++;

    }

    stack.push(pre[i]); // 当前操作符优先级大于栈顶操作符的优先级,将该操作符入栈

   }

   i++;

}

while(stack.top) // 将所有还没有出栈的操作符加入后缀表达式

{

   post[j++] = stack.pop();

   n++;

}

}

// 判断是否为运算符 

bool isoperator(char op)

{

switch(op)

{

case '+':

case '-':

case '*':

case '/':

   return 1;

default : 

   return 0;

}

}

// 求运算符优先级

int priority(char op)

{

switch(op)

{

case '#':

   return -1;

case '(':

   return 0;

case '+':

case '-':

   return 1;

case '*':

case '/':

   return 2;

default :

   return -1;

}

return -1;

}

// 将数字字符串转变成相应的数字

double readnumber(char str[],int *i)

{

double x=0.0;

int k = 0;

while(str[*i] >='0' && str[*i]<='9') // 处理整数部分

{

   x = x*10+(str[*i]-'0');

   (*i)++;

}

if(str[*i]=='.') // 处理小数部分

{

   (*i)++;

   while(str[*i] >= '0'&&str[*i] <='9')

   {

    x = x * 10 + (str[*i]-'0');

    (*i)++;

    k++;

   }

}

while(k!=0)

{

   x /= 10.0;

   k--;

}

return x;

}

// 由后缀表达式字符串计算相应的中值表达式的值

double postfix_value(char post[])

{

MyStack<double> stack; // 操作数栈

stack.init();

int i=0 ;

double x1,x2;

while(post[i] !='#')

{

   if(post[i] >='0' && post[i] <='9')

    stack.push(read_number(post,&i));

   else if(post[i] == ' ')

    i++;

   else if (post[i] =='+')

   {

    x2 = stack.pop();

    x1 = stack.pop();

    stack.push(x1+x2);

    i++;

   }

   else if (post[i] =='-')

   {

    x2 = stack.pop();

    x1 = stack.pop();

    stack.push(x1-x2);

    i++;

   }

   else if (post[i] =='*')

   {

    x2 = stack.pop();

    x1 = stack.pop();

    stack.push(x1*x2);

    i++;

   }

   else if (post[i] =='/')

   {

    x2 = stack.pop();

    x1 = stack.pop();

    stack.push(x1/x2);

    i++;

   }

}

return stack.gettop();

}

// main()函数

void main()

{

char pre[] ="2*((6-4)+8/4)#";

char post[100] ;

cout <<"中缀表达式为:"<< pre << endl;

int n =0;    // 返回后缀表达式的长度

postfix(pre,post,n);

cout <<"后缀表达式为:";

for( int i =0 ;i < n ;i++)

   cout << post[i] ;

cout << "\n由后缀表达式计算出的数值结果: ";

cout << postfix_value(post) << endl;

system("pause");

}

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式