c++栈之带括号的四则运算

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">题目要求:</span>
 

         实现带括号的四则运算。

实现思想:

       创建两个栈,保存数字和符号,根据运算级的高低,确定弹栈以及压栈(栈为模板类,因为有两个不同类型的栈)。

代码


#include<iostream>
#define MAX 50
using namespace std;
template<typename T> class myStack
{
	private:
		T data[MAX];
		int size;
	public:
		myStack()
		{
	       size=0;
        } 
		void push(T a)
		{
	       data[size]=a;
	       size++;
        }
		T pop()
		{
	      T a=data[--size];
	       return a;
        }
		T getTop()
		{
	       T a=size-1;
	       return data[a];
        }
		int getSize()
		{
        	return size;
        }
		bool isEmpty()
		{
	     return size==0;
        }
}; 
float oper(myStack<int> &aa,myStack<char> &bb)                                //栈顶运算 
{
	float v1,v2,v;
	char op;
	op=bb.pop();
	v2=aa.pop();
	v1=aa.pop();
	switch(op)
	{
		case'+':v=v1+v2;break;
		case'-':v=v1-v2;break;
		case'*':v=v1*v2;break;
		case'/':v=v1/v2;break;
	}
	aa.push(v);
	return v;
}
int main(int argc, char** argv)
{
	myStack<int> a;
	myStack<char> b;
    char c;
    int i;
    cin>>c;
    int j=1;
    while(c!='#')
    {
   	if(c!=42&&c!=40&&c!=41&&c!=43&&c!=45&&c!=47)
		{
			if(j==1)
			  a.push(c-'0');
			else
			{
				if(j==2)
				{
					int ja=c-'0';
					int jb=a.pop();
					a.push(jb*10+ja);
				}
				else
				{
					int ja=c-'0';
					int jb=a.pop();
					int jc=a.pop();
					a.push(jc*100+jb*10+ja);
				}
				
			}
		  	j++;
		} 
		else
		{
			j=1;
			switch(c)
			{
				case'(':b.push(c);
				        break;
				case')':while(b.getTop()!='(')
		    	           {
		    	           //	int i;
		    	             oper(a,b);
		    	           //  i=a.getTop();
						   }
						b.pop();
					    break;
				case'+':;
				case'-':while(!b.isEmpty()&&b.getTop()!='('&&b.getTop()!='*')
				           oper(a,b);
					    b.push(c);
					    break;
				case'*':;
				case'/':while(b.getTop()=='*'||b.getTop()=='/')
				           oper(a,b);
					    b.push(c);
					    break;
				i=a.getTop();		   	 	  	      
		    }  
			
		}
		i=a.getTop();
		cin>>c;
    }
    while(!b.isEmpty())
    {
    
	   oper(a,b);
	   i=a.getTop();
    }
	i=a.getTop();
	cout<<a.pop();  
	return 0;
}


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值