您的位置:首页 > 理论基础 > 数据结构算法

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

2007-11-16 16:17 309 查看
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/*#

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

闪……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: