用栈的知识实现四则运算(带括号的加减乘除)

#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;
void size_yunsuan(string input,string &a)
{
	int i=0;
	int length=input.size();
	stack<char> stack1;
	while(i<length)
	{
		//cout<<input[i]<<endl;
		if(input[i]>='0'&&input[i]<='9')
			a.push_back(input[i]);
		if(input[i]=='+'||input[i]=='-')
		{
			if(stack1.empty()||stack1.top()=='('||stack1.top()=='+'||stack1.top()=='-')
			{

				stack1.push(input[i]);
			}
			else
			{
				while(!stack1.empty())
				{
					a.push_back(stack1.top());
					stack1.pop();
				}
			}
		}
		if(input[i]=='(')
			stack1.push(input[i]);
		if(input[i]==')')
		{
			while(stack1.top()!='(')
			{
				a.push_back(stack1.top());
				stack1.pop();
			}
			stack1.pop();
		}
		if(input[i]=='*'||input[i]=='/')
		{
			stack1.push(input[i]);
		}
		i++;
	}
	while(!stack1.empty())
	{
		a.push_back(stack1.top());
				stack1.pop();
	}

}

int yunsuan(string a)
{
	if(a.size()==0)
		return -1;
	int i=0;
	int length=a.size();
	stack<int> temp;
	int key=0;
	int first,second;
	while(i<length)
	{
		cout<<a[i]<<endl;
		if(a[i]>='0'&&a[i]<='9')
			temp.push(a[i]-'0');
		else
		{
		   switch (a[i])
		   {
		   case '+':
			   first=temp.top();
			   temp.pop();
			   second=temp.top();
			   temp.pop();
			   key=first+second;
			   temp.push(key);
			   break;
		   case '-':
			   first=temp.top();
			   temp.pop();
			   second=temp.top();
			   temp.pop();
			   key=second-first;
			   temp.push(key);
			   break;
		   case '*':
			   first=temp.top();
			   temp.pop();
			   second=temp.top();
			   temp.pop();
			   key=second*first;
			   temp.push(key);
			   break;
		   case '/':
			   first=temp.top();
			   temp.pop();
			   second=temp.top();
			   temp.pop();
			   key=second/first;
			   temp.push(key);
			   break;
		 //  default:
			   //break;

		   }
		}
		++i;
	}
	return temp.top();
}
void calculate(string s)
{
	string a;
	size_yunsuan(s,a);
	cout<<yunsuan(a)<<endl;;
}
int main()
{
	string s("(3+5)/8");
	calculate(s);
	system("pause");
	return 0;
}

时间: 2024-08-27 19:22:59

用栈的知识实现四则运算(带括号的加减乘除)的相关文章

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

科学计算器(可实现带括号的浮点数四则运算)

/* Name: 科学计算器(可实现带括号的浮点数四则运算) Copyright: Author: Date: 15-09-14 21:49 Description: 从文件读入计算表达式,将计算表达式转换为逆波兰表达式,然后计算出逆波兰表达式的值,最后输出答案. */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<math.h> #define MAXSIZE 200 vo

数据结构复习_栈和队列,应用_括号匹配&amp;文件目录递归拷贝,

1.主题 2.学习视频和资料 视频    http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=701019&courseId=555010 http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=702024&courseId=555010 3.实现 数组或列表实现 4.应

九、运用栈的知识对后缀表达式的运算方式进行表达

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在运用栈的知识对后缀表达式的运算方式进行表达 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* next; }; Lin

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

c++ new带括号和不带括号

在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base = new CDerived();CBase *base = new CDeviced; 很多人都说,加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数.这是有问题的. 对于自定义类类型: 如果该类没有定义构造函数(由编译器合成默认构造函数)也没有虚函数,那么class c = new class;将不调用合成的默认构造函数,而class c = new class();则会调用

JavaScript 函数调用时带括号和不带括号的区别

function countBodyChildren(){ var body_element = document.getElementsByTagName("body")[0]; alert(body_element.childNodes.length); } window.onload = countBodyChildren; //window.onload = countBodyChildren(); 代码功能:在弹出框显示body元素的子元素. 不带括号为9: 带括号为8,在加

[转]c++ new带括号和不带括号

ref:http://m.blog.csdn.net/blog/u012745772/42420443 在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base = new CDerived();CBase *base = new CDeviced; 很多人都说,加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数.这是有问题的.对于自定义类类型: 如果该类没有定义构造函数(由编译器合成默认构造函数)也没有虚函数,那么class c =

使用laravel 生成 带括号的sql

laravel query builder use where case I want to  sql like that : select * from `wxm_ticket` where `wxm_ticket`.`deleted_at` is null and `user_id` = ? and `sell_status` = ? and (`stop_sell` is null or `stop_sell` >= ?) php code: $query = TicketModel::u