`

栈的应用——表达式求值

阅读更多

一、从原表达式求得后缀式

表达式存放在字符型数组str中,其后缀表达式存放在字符型数组exp中,转换过程中用一个字符型数组op作为栈。依次处理字符串str中的每个字符ch,对于每一个ch

(1)ch为数字将其存放在exp中。

(2)ch为左括弧“(将其压栈

(3)ch为右括弧“),将栈op中“(上面的操作符出栈依次存入exp中,然后“(出栈

(4)ch为“+”或“-,将op中“(上面的所有字符(运算符)依次出栈并存入exp中,然后将ch入栈op中。

(5)ch为“*”或“/,将op中的栈顶连续的“*”或“/出栈并依次存入exp中,然后将ch入栈op中。

(6)str扫描完毕,将op中的所有运算符依次删除并存入exp中,再将ch结束标志存入数组exp中。

#include <iostream>
#include <conio.h>  
#define MaxSize 10

typedef struct{
	char data[MaxSize];    //存放运算符
    int top;		       //栈的最高位置
}Stack;

void trans (const char *str,  char *exp){
	Stack op;
	char ch;
	int s=0, e=0;         //e作为exp的下标, s作为str的下标
	op.top=-1;
	ch=str[s];   
	s++;

	while (ch!='\0'){         //扫描字符串
		switch(ch){    
		    case '(':	     //将ch压栈
		        op.top++;    
				op.data[op.top]=ch;  
				break;

	        case ')':	     //将op中(上面的数据依次复制到exp中
				while (op.data[op.top]!='('){  
					exp[e]=op.data[op.top];
                    op.top--;  
					e++; 
				}
		       op.top--;      //(出栈 
			   break;

			case '+':
			case '-':      //前面的运算必定都算完才算当前加减,故将栈中(前面的都出栈到exp中
				 while (op.top!=-1 && op.data[op.top]!='('){
					 exp[e]=op.data[op.top];
					 op.top--;
					 e++;
				 } 
	            op.top++;
				op.data[op.top]=ch; 
				break;

            case '*': 
            case '/':       //前面的乘除必定都算完才算当前乘除,故将栈连续的乘除都出栈到exp中
               while (op.top!=-1 && op.data[op.top]=='*' || op.data[op.top]=='/') {
				   exp[e]=op.data[op.top];
				   op.top--; 
				   e++; 
			   }
			   op.top++;   
			   op.data[op.top]=ch; 
			   break;

           case ' ':
			   break;	    //过滤掉空格

           default: 
			   while (ch>='0' && ch<='9'){        //判定为数字
	               exp[e]=ch;
				   e++;
	               ch=str[s];
				   s++;
			   }
               s--;  
			   exp[e]='#';     //用#标识一个数值串结束
			   e++; 
      }    //switch
            ch=str[s]; s++;
	}   //while

	while (op.top!=-1) {     //str扫描完毕,栈不空
        exp[e]=op.data[op.top];
        e++;
		op.top--;  
	} 
    exp[e]='\0';   //exp结束标识
} 


int main(){
	char *str="(5+6*5)+9/(5+6*5)";
   //	char *exp;
	char exp[20]="";
	std::cout<<str<<std::endl;
	trans(str,exp);
	std::cout<<exp<<std::endl;
	getch();
	return 1;
}

  运行结果:

 

(5+6*5)+9/(5+6*5)
    5#6#5#*+9#5#6#5#*+/+

 

二、后缀表达式求值
    从左到右读入后缀表达式,若读入的是一个操作数,就将它入数值栈;若读入的是一个运算符op,就从数值栈中连续出栈两个元素(两个操作数),假设为x和y,计算x op y之值,并将计算结果入数值栈;对整个后缀表达式读入结束时,栈顶元素就是计算结果。

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 20

typedef struct {   
	float data[MaxSize];	//存放数值
	int top;		    	//栈指针
}Stack;		

float compvalue(char *exp){	 //计算后缀表达式的值
	Stack st;
    int d; 
	char ch;
	int e=0;            	//e作为exp的下标
    st.top=-1;  ch=exp[e];   e++;
    while (ch!='\0'){	    //扫描exp
		switch (ch){ 
		case '+':st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];st.top--;break;
        case '-':st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];st.top--;break;
        case '*':st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];st.top--;break;
        case '/': 
			if (st.data[st.top]!=0){
			     st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];st.top--;break;
			}else {    
				printf("\n\t除零错误!\n");
			    exit(-1);	
		    }
        default: 
			d=0;           //数值存放到d中
            while (ch>='0' && ch<='9') {  
				d=10*d+ch-'0';  
				ch=exp[e];e++; 
			}
            st.top++;  
		    st.data[st.top]=d;
		}   //case  
         ch=exp[e];  
		 e++;
	}  //while结束   
	return st.data[st.top];
} 

int main(){
	char *exp="5#6#5#*+9#5#6#5#*+/+";
	float b=compvalue(exp);
	printf("\n%f",b);
	return 1;
}

 运行结果:

35.257141

分享到:
评论

相关推荐

    栈的应用----算术表达式求值程序

    该程序很好实现了算术表达式求值,支持+、-、*、/,以=结束,符合正常表达式。

    栈的应用——表达式求解,中缀表达式转换成后缀表达式

    栈的应用——表达式求解,内容主要有 中缀表达式转换成后缀表达式以及求解过程,需要可自行下载

    数据结构课程设计——表达式求值

    数据结构 课程设计 表达式求值

    C++实现表达式求值 文件

    C++实现表达式求值 本实验要求设计一个算术表达式求值的程序,该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=ab )的中缀表达式,并求出结果。如果表达式正确,则输出表达式的结果;如果表达式非法...

    数据结构栈的表达式实验报告

    关于数据结构栈的表达式实验报告,自己写的,可以参考一下的吧,可以输入小数进行计算

    栈的应用之中缀表达式求值(QT平台)

    本程序利用两个栈——一个符号栈一个数字栈,实现了中缀表达式的计算,代码风格是C++,运行平台是QT,欢迎大家下载参考。

    数据结构-实验3-后缀表达式求值.doc

    2) 掌握栈的典型应用——后缀表达式求值。 2. 实验内容 1) 用键盘输入一个整数后缀表达式(操作数的范围是0~9,运算符只含(、(、*、/,而 且中间不可以有空格),使用循环程序从左向右读入表达式; 2) 如果读入的...

    数据结构大作业C++实现简单的计算器——算术表达式计算(包含实验报告)

    表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 【基本要求】 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。...

    基于C++实现算数表达式求值(数据结构课设)【100012317】

    大二下半学期数据结构课程设计——算术表达式求值是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。

    栈的应用——括号的匹配

    栈的应用——括号的匹配,输入表达式,判断表达式是否匹配成功。。。。。。。。

    数据结构与算法实验报告

    2.3.6 栈的应用——四则运算表达式求值 10 3 实验三 二叉树的构造与遍历 13 3.1 实验目的 13 3.2 实验要求 13 3.3 实验内容 13 3.3.1 二叉树结构体的构造 13 3.3.2 二叉树的节点产生 13 3.3.3 二叉树的前序遍历 14 ...

    表达式求值

    表达式求值 ——栈的操作和应用 本程序是一个控制台程序,要求用户从控制台输入语法正确的、不含变量的表达式,并利用给定的优先关系实现对算术四则运算的求值。变大时可以使用加减乘除四则运算符,支持括号、浮点数

    数据结构习题答案(全部算法)严蔚敏版

    3.1.4 栈的应用 3.2 队列 3.2.1 队列的定义及运算 3.2.2 队列的顺序存储结构(向量) 3.2.3 队列的链表存储结构 3.3 栈和队列的算法实现举例 习题三 第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.2.1 串...

    华南 数据结构上机实验代码 完整代码

    表达式求值 队列的应用——银行客户平均等待时间 计算next值 KMP算法 二叉树的构建及遍历操作 实现二叉排序树的各种算法(1) 实现二叉排序树的各种算法(2) 哈夫曼树 顺序查找 二分查找 哈希查找 直接插入...

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    3.2.3 表达式求值 51 3.3 栈与递归 54 3.3.1 采用递归算法解决的问题 54 3.3.2 递归过程与递归工作栈 57 3.3.3 递归算法的效率分析 59 3.3.4 将递归转换为非递归的方法 60 3.4 队列 61 3.4.1 队列的...

    《算法笔记》codeup6.7和7.1题目A简单计算器题目编号1918全部测试样例和输出样例

    codeup《算法笔记》6.7小节——C++标准模板库(STL)介绍-&gt;stack的常见用法详解题目A:简单计算器题目编号:1918、《算法笔记》7.1小节——数据结构专题(1)-&gt;栈的应用题目A:简单计算器题目编号:1918: 题目描述: ...

    Chapter4-Src_堆栈_

    堆栈、线性表相关函数:链和数组实现队列类、 栈类,并有对应的应用——车站调度以及中缀后缀表达式的分析。

    Java Web程序设计教程

    5.4值栈与ognl表达式 100 5.5struts2的标签库 103 5.5.1控制标签 103 5.5.2数据标签 104 5.5.3表单标签 105 5.5.4非表单ui标签 107 本章小结 108 课后练习 109 第6章struts2高级应用 110 6.1拦截器 110 ...

    数据结构与算法分析C描述第三版

     4.2.2 一个例子——表达式树   4.3 查找树ADT——二叉查找树   4.3.1 contains   4.3.2 findMin和findMax   4.3.3 insert   4.3.4 remove   4.3.5 析构函数和复制赋值操作符   4.3.6 平均...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...

Global site tag (gtag.js) - Google Analytics