数据结构习题学习笔记(The Third Day)

 Q1:编写一个函数将一般算术表达式转化为逆波兰表达式。

假设表达式是以字符的形式由键盘输入(简单起见,设算术表达式中的参加运算的数只有一位数字)。

字符数组str:算术表达式

字符数组exp:逆波兰表达式

字符数组stack:栈

方法如下:

1,若C为数字 -> 将C依次存入数组exp中;

2,若C为左括号"(" -> 将此括号压入栈;

3,若C为右括号")" -> 将栈stack中左括号"("以前的字符依次弹出并存入数组exp中,将"("弹出;

4,若C为"+"或"-" -> 将栈stack中"("以前的所有字符号依次弹出并存入数组exp中,然后将C压入栈stack中;

5,若C为"*"或"/" -> 将当前栈stack中栈顶连续的"*"或"/"弹出并存入数组exp中,然后将C压入栈stack中;

6,若C为"#" -> 将栈所有运算符弹出并存入数组exp中,符号然后将C压入数组exp中,最后转换的逆波兰表达式在exp中.

My View:

1,波兰式:二叉树前缀表示;逆波兰式:二叉树后缀表示(在数据结构中有具体解释)

2,C的判断主要是根据符号运算的优先级,栈中弹出的都是比C优先级高或相等的.比如:C为"+",则必须弹出"+","-","*","/".

CODE:

 

 

//  trans.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#define  Maxsize 100/*Maxsize为算术表达式中最多字符个数*/

void  trans()
{
    
char str[Maxsize];//存储原算术表达式
    char exp[Maxsize];//存储转换后的波兰表达式
    char stack[Maxsize];//作为栈使用

    
char ch;
    
int i,j,t,top=0;//t作为exp下标,top作为stack下标,i作为str下标
    i=0;//获取用户输入的表达式

    
do
    
{
        i
++;
        scanf(
"%c",&str[i]);
    }
while((str[i]!='#')&&(i<Maxsize));
    t
=0;i=0;
    ch
=str[i];i++;
    
while(ch!='#')
    
{
        
if((ch>='0')&&(ch<='9'))//判定为数字
        {
            exp[t]
=ch;t++;
        }
else 
            
if(ch=='(')//判定为左括号
            {
                top
++;
                stack[top]
=ch;
            }
else 
                
if(ch==')')//判定为右括号
                {
                    
while(stack[top]!='(')
                    
{
                         exp[t]
=stack[top];
                         top
--;
                         t
++;
                    }

                    top
--;//将左括号弹出
                }
else
                    
if((ch=='+')||(ch=='-'))//判定为加减号
                    {
                        
while((top!=0&& (stack[top]!='('))
                        
{
                            exp[t]
=stack[top];
                            top
--;
                            t
++;
                        }

                        top
++;
                        stack[top]
=ch;
                    }
else
                        
if((ch=='*')||(ch=='/'))//判定为乘除
                        {
                            
while((stack[top]=='*')||(stack[top]=='/'))
                            
{
                                exp[t]
=stack[top];
                                top
--;
                                t
++;
                            }

                            top
++;
                            stack[top]
=ch;
                        }

                        ch
=str[i];//继续判断字符
                        i++;
    }

    
while(top!=0)
    
{
        exp[t]
=stack[top];
        t
++;
        top
--;
    }

    exp[t]
='#';
    
for(j=0;j<=t;j++)
        printf(
"%c",exp[j]);
    printf(
" ");
}


void  main()
{
    trans();
}


 

RUN:

测试数据:(1+2)*((3-4)/5)#

输出结果:12+34-5/*#

已更正错误!!!!!!!!!!!!!

闪……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值