中缀转为后缀并求值_legend
来源:互联网 发布:ubuntu安装完没有引导 编辑:程序博客网 时间:2024/06/09 22:55
中缀表达式->后缀表达式,并求值:
(1)中缀表达式->后缀表达式的方法:
(1.0)定义一个符号栈:存储+,-,*,/,(,)等符号。
(1.1)遇到操作数:直接添加到后缀表达式中;
(1.2)栈为空时遇到运算符:直接入栈;
(1.3)遇到左括号:将其入栈;
(1.4)遇到右括号:执行出栈操作,并将出栈元素加入到后缀中,
直到出栈的是左括号,左括号不加入到后缀中。
(1.5)遇到其他运算符如+,—,*,/:弹出所有优先级大于等于该
运算符的栈顶元素,加入到后缀中;然后该运算符入栈。
(1.6)最终将符号栈中的元素依次出栈。
(2)后缀表达式求值:
(2.1)建一个操作数的 栈:
(2.2)遇到操作数:入栈
(2.3)遇到运算符:出栈两个操作数,然后运算,将运算结果入栈;
(2.4)最终栈中仅有一个数,就是最终结果;
(3)代码实现:
/*
简单的中缀转为后缀,
只能计算10以内的数,支持+,-,*,/,(,)
等运算符。
*/
#include<stdio.h>
#include <stack>
#include<iostream>
#include<string.h>
using namespace std;
bool isOperator(char ch){
char ops[]="+-*/";
/*建表*/
int len=sizeof(ops)/sizeof(ops[0]);
/*查表*/
for(int i=0;i<len;i++){
if(ch==ops[i])
return true;
}
return false;
}
/*比较两个字符的 优先级,
如果op1>op2返回1
如果op1=op2返回0
否则返回-1
*/
int precedence(char op1,char op2){
if(op1=='(')
return -1;
if(op1=='+' || op1=='-'){
if('*'==op2 || '/'==op2 )
{
return -1;
}else {
return 0;
}
}
else if( '*'==op1 || '/'==op1){
if('+'==op2 || '-'==op2){
return 1;
}else {
return 0;
}
}
}
/*
中缀表达式->后缀
*/
void inFix2PostFix(char* inFix,char* postFix){
int j=0;/*后缀表达式数组初始下标为0*/
int len;/*len of infix*/
char c;
stack<char> opeStack;
len=strlen(inFix);
for(int i=0;i<len;i++){
c=inFix[i];
if( '('==c ){
opeStack.push(c);
}
else if( ')'==c ){
while(opeStack.top()!='(' ){
postFix[j++]=opeStack.top();
opeStack.pop();
}
opeStack.pop();/*把'('弹出*/
}else {
if(! isOperator(c) )
opeStack.push(c);/*应该是postFix[j++]=c;*/
else{
/*栈非空,且栈顶运算符的优先级大于当前的运算符*/
while(opeStack.empty()==false && precedence(opeStack.top(),c)>=0){
postFix[j++]=opeStack.top();
opeStack.pop();
}
opeStack.push(c);
/*栈为空,需入栈;当前的运算符比栈顶高时需要入栈。*/
}
}
}
while(opeStack.empty==false){
postFix[j++]=opeStack.top();
opeStack.pop();
}
postFix[j]=0;/*串的结束标识*/
}
/*后缀表达式运算:
遇到操作数,入栈;
遇到运算符,出栈两个数,然后运算,将运算结构再入栈;
栈为操作数的栈:
*/
double postFixVal(char * postFix){
stack<char> stack;
int len=strlen(postFix);
char c;
for(int i=0;i<len;i++){
c=postFix[i];
if(isOperator(c)==false){
stack.push(c-'0');
}else {
char op2,op1;
int val;
op1=stack.top();
stack.pop();
op2=stack.top();
stack.pop();
switch(c){
case '+':
val=op1+op2;break;
case '-':
val=op2-op1;break;
case '*':
val=op1*op2;break;
case '/':
val=op2/op1;break;
}
stack.push(val);
}
}
return stack.top();
}
int main(){
char inFix[30];
char postFix[30];
double val;
while(1){
printf("enter an expression\n");
gets(inFix);
if(strlen(inFix)==0)
continue;
printf("\n infix is %s ",inFix);
inFix2PostFix(inFix,postFix);
printf("\n postFix is %s",postFix);
val=postFixVal(postFix);
printf("\nthe result is %.3f",val);
}
return 0;
}
(1)中缀表达式->后缀表达式的方法:
(1.0)定义一个符号栈:存储+,-,*,/,(,)等符号。
(1.1)遇到操作数:直接添加到后缀表达式中;
(1.2)栈为空时遇到运算符:直接入栈;
(1.3)遇到左括号:将其入栈;
(1.4)遇到右括号:执行出栈操作,并将出栈元素加入到后缀中,
直到出栈的是左括号,左括号不加入到后缀中。
(1.5)遇到其他运算符如+,—,*,/:弹出所有优先级大于等于该
运算符的栈顶元素,加入到后缀中;然后该运算符入栈。
(1.6)最终将符号栈中的元素依次出栈。
(2)后缀表达式求值:
(2.1)建一个操作数的 栈:
(2.2)遇到操作数:入栈
(2.3)遇到运算符:出栈两个操作数,然后运算,将运算结果入栈;
(2.4)最终栈中仅有一个数,就是最终结果;
(3)代码实现:
/*
简单的中缀转为后缀,
只能计算10以内的数,支持+,-,*,/,(,)
等运算符。
*/
#include<stdio.h>
#include <stack>
#include<iostream>
#include<string.h>
using namespace std;
bool isOperator(char ch){
char ops[]="+-*/";
/*建表*/
int len=sizeof(ops)/sizeof(ops[0]);
/*查表*/
for(int i=0;i<len;i++){
if(ch==ops[i])
return true;
}
return false;
}
/*比较两个字符的 优先级,
如果op1>op2返回1
如果op1=op2返回0
否则返回-1
*/
int precedence(char op1,char op2){
if(op1=='(')
return -1;
if(op1=='+' || op1=='-'){
if('*'==op2 || '/'==op2 )
{
return -1;
}else {
return 0;
}
}
else if( '*'==op1 || '/'==op1){
if('+'==op2 || '-'==op2){
return 1;
}else {
return 0;
}
}
}
/*
中缀表达式->后缀
*/
void inFix2PostFix(char* inFix,char* postFix){
int j=0;/*后缀表达式数组初始下标为0*/
int len;/*len of infix*/
char c;
stack<char> opeStack;
len=strlen(inFix);
for(int i=0;i<len;i++){
c=inFix[i];
if( '('==c ){
opeStack.push(c);
}
else if( ')'==c ){
while(opeStack.top()!='(' ){
postFix[j++]=opeStack.top();
opeStack.pop();
}
opeStack.pop();/*把'('弹出*/
}else {
if(! isOperator(c) )
opeStack.push(c);/*应该是postFix[j++]=c;*/
else{
/*栈非空,且栈顶运算符的优先级大于当前的运算符*/
while(opeStack.empty()==false && precedence(opeStack.top(),c)>=0){
postFix[j++]=opeStack.top();
opeStack.pop();
}
opeStack.push(c);
/*栈为空,需入栈;当前的运算符比栈顶高时需要入栈。*/
}
}
}
while(opeStack.empty==false){
postFix[j++]=opeStack.top();
opeStack.pop();
}
postFix[j]=0;/*串的结束标识*/
}
/*后缀表达式运算:
遇到操作数,入栈;
遇到运算符,出栈两个数,然后运算,将运算结构再入栈;
栈为操作数的栈:
*/
double postFixVal(char * postFix){
stack<char> stack;
int len=strlen(postFix);
char c;
for(int i=0;i<len;i++){
c=postFix[i];
if(isOperator(c)==false){
stack.push(c-'0');
}else {
char op2,op1;
int val;
op1=stack.top();
stack.pop();
op2=stack.top();
stack.pop();
switch(c){
case '+':
val=op1+op2;break;
case '-':
val=op2-op1;break;
case '*':
val=op1*op2;break;
case '/':
val=op2/op1;break;
}
stack.push(val);
}
}
return stack.top();
}
int main(){
char inFix[30];
char postFix[30];
double val;
while(1){
printf("enter an expression\n");
gets(inFix);
if(strlen(inFix)==0)
continue;
printf("\n infix is %s ",inFix);
inFix2PostFix(inFix,postFix);
printf("\n postFix is %s",postFix);
val=postFixVal(postFix);
printf("\nthe result is %.3f",val);
}
return 0;
}
0 0
- 中缀转为后缀并求值_legend
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式变后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀并求值
- 中缀转后缀求值
- 中缀 后缀表达式求值
- 中缀转后缀&后缀求值
- 有中缀表达式转换为后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- C语言 实现中缀表达式转后缀表达式并求值
- C/C++ 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- C++实现中缀表达式转后缀表达式并求值
- 搭建属于你的家庭网络实时监控–HTML5在嵌入式系统中的应用·高级篇
- 从1.5k到18k, 一个程序员的5年成长之路【转】
- C# 中的委托和事件
- Qt Quick 简介
- lua IDE for cocos2d-x development
- 中缀转为后缀并求值_legend
- linux 服务器安装jdk和tomcat
- 函数模板和类模板成员函数的定义通常放在头文件中
- C#.NET调用WSDL接口及方法
- 基于单幅深度图像的实时人体部位动作识别(摘要+概述)
- @synthesize obj=_obj的意义详解 @property和@synthesize
- HTML学习第二天
- 招远血案死者孩子已知妈妈去世 安慰爸爸不要哭
- Binary Tree Level Order Traversal II