数据结构实验:栈实现计算器(表达式计算)

原创作品转载请注明出处

欢迎抄袭,造福各位伸手党

/*************************************************************************
    > File Name: evaluator.cpp
    > Author: acvcla
    > version 1.01
    > QQ:[email protected]
    > Mail: [email protected]
    > Created Time: 2014年11月17日 星期一 23时34分13秒
    >本计算器支持加减乘除四种运算,支持浮点,输入表达式后,按回车计算结果
    >退出请输入EOF(win下按ctrl+z,linux下按ctrl+d)
    >代码在G++环境下编译通过,推荐使用codeblocks编译运行,强烈不推荐VC++6.0
    >若没有codeblocks,可以使用dev c++或者VS2010以上版本
*************************************************************************/
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
const int init_size=10;
const int maxn=100005;
#define Debug
template <typename T>
struct Stack
{
	string name;
	T *base,*top;
	int size;
	Stack(const string s="None"):name(s)/*初始化栈*/
	{
		top=base=new T[size=init_size];
	}
	void Expansion();
	void push(T e)/*入栈*/
	{
		Expansion();
		#ifdef Debug
		cout<<name<<"    push		"<<e<<endl;
		#endif
		*top++=e;
	}
	T & Top()const/*取栈顶引用*/
	{
		return *(top-1);
	}
	bool empty()const/*判断栈是否为空*/
	{
		return base==top;
	}
	T pop()/*返回栈顶元素并出栈*/
	{
		if(empty()){
			cout<<name<<" is empty"<<endl;
			return T(NULL);
		}
		#ifdef Debug
		cout<<name<<"    pop		"<<*(top-1)<<endl;
		#endif
		return *(--top);
	}
};

template<typename T>
void Stack<T>::Expansion()/*扩容函数*/
{
	if(top-base>=size){
			T *newbase= new T[size<<=1];/*成倍增加减少均摊复杂度,均摊O(1)*/
			int i=0;
			while(base+i!=top)*(newbase+i)=*(base+i);/*复制到新开辟的空间*/
			delete base;/*释放旧的空间*/
			base=newbase;
		}
}
void readnum(char *&S,Stack<double>&f)/*从S中读取数字并将S指向数字后的第一个操作符*/
{
	double tmp=0,c=1;
	int found=0;
	while(isdigit(*S)||*S=='.')
	{
		if(*S=='.'){
			found=1;
			S++;
			continue;
		}
		if(found)c*=10;
		tmp=tmp*10+(*S)-'0';
		S++;
	}
	f.push(tmp/c);
}
double calcu(double a,char op,double b)/*计算a op b*/
{
	switch(op){
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case '/':return a/b;
	}
}
int optoi(const char op)/*将操作符转成数字*/
{
	switch(op){
		case '+':return 0;
		case '-':return 1;
		case '*':return 2;
		case '/':return 3;
		case '(':return 4;
		case ')':return 5;
		case '\0':return 6;
	}
}
char oderbetween(const char a,const char b)/*判断操作符优先级*/
{
	const int op_kind=10;
	const char pri[op_kind][op_kind]=
	{
		">><<<>>",
		">><<<>>",
		">>>><>>",
		">>>><>>",
		"<<<<<= ",
		"       ",
		"<<<<< ="
	};
	return pri[optoi(a)][optoi(b)];
}
double evaluate(char *S)/*算法主过程*/
{
	Stack<double>opnd("opnd");/*操作数栈*/
	Stack<char>optr("optr");/*操作符栈*/
	optr.push('\0');
	while(!optr.empty()){
		if(isdigit(*S)||*S=='.')readnum(S,opnd);/*读取数字*/
		else{
			if(*S==' ')continue;
			switch(oderbetween(optr.Top(),*S)){/*根据优先级进行计算*/
				case '<':optr.push(*S);S++;break;
				case '=':optr.pop();S++;break;
				case '>':{
					char op=optr.pop();
					double opnd2=opnd.pop(),opnd1=opnd.pop();
					opnd.push(calcu(opnd1,op,opnd2));
					break;
				}

			}
		}
	}
	return opnd.pop();
}
char exptr[maxn];/*表达式数组*/
int main(int argc, char const *argv[])
{
	while(cin>>exptr){
		cout<<evaluate(exptr)<<endl;
	}
	return 0;
}
时间: 2024-12-14 18:28:23

数据结构实验:栈实现计算器(表达式计算)的相关文章

使用后缀表达式写的数据结构实验,实现计算器

数据结构实验需要使用后缀表达式进行计算的设计 自己写的可以实现简单的‘+-*/’运算以及包括‘() [] {} 指数 小数 2e3’等的运算,用于交作业,功能很少,代码如下 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <stdbool.h> #include <math.h> //定义操作数的最大位数 #define MAX 64 typedef stru

数据结构实验:计算表达式的值--顺序栈

实验题目:栈的应用-算术表达式求值 实验环境:    Visual C++ 6.0                   实验目的 : 1 .掌握栈的定义及实现: 2 .掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法.对算法3.4中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符: (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级: (3) 函数Operate(a,theta,b):对

数据结构实验之栈二:一般算术表达式转换成后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

[数据结构与算法] 栈的应用:计算 2*2+(10-2)/(101-50*2)*3-2+5 表达式的值

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289892.html 1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Stack; 4 import java.util.regex.Mat

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

数据结构实验之栈三:后缀式求值

数据结构实验之栈三:后缀式求值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值. 输入 输入一个算术表达式的后缀式字符串,以'#'作为结束标志. 输出 求该后缀式所对应的算术表达式的值,并输出之. 示例输入 59*684/-3*+# 示例输出 57 提示 基本操作数都是一位正整数! 来源 示例程序 #include <stdio.h>

数据结构实验之栈三:后缀式求值 (stack)

数据结构实验之栈三:后缀式求值 Time Limit: 1000MS Memory limit: 65536K 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值. 输入 输入一个算术表达式的后缀式字符串,以‘#’作为结束标志. 输出 求该后缀式所对应的算术表达式的值,并输出之. 示例输入 59*684/-3*+# 示例输出 57 1 #include<stdio.h> 2 #include<string.h> 3 #include&

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例: