zoukankan      html  css  js  c++  java
  • 栈应用——表达式求值

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    const int EXPLENGHT=20;
    const int STACK_INIT_SIZE=20;
    const int STACK_INCRMENT=10;
    template<typename ElemType>
    class Stack
    {
    public:
    	Stack()
    	{
    		m_base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    		if(!m_base)
    			exit(0);
    		m_top=m_base;
    		m_size=STACK_INIT_SIZE;
    		m_item=0;
    	}
    	~Stack()
    	{
    		free(m_base);
    		m_base=m_top=NULL;
    	}
    	void push(ElemType e)
    	{
    		if(m_top-m_base>=m_size)
    		{
    			m_base=(ElemType*)realloc(m_base,(m_size+STACK_INCRMENT)*sizeof(ElemType));
    			if(!m_base)
    				exit(0);
    			m_top=m_base+m_size;
    			m_size+=STACK_INCRMENT;
    
    		}
    		*(m_top)=e;
    		m_top++;
    		m_item++;
    	}
    	void pop(ElemType &e)
    	{
    		if(m_top==m_base)
    			return;
    		m_top--;
    		e=*m_top;
    		m_item--;
    
    	}
    	int size()
    	{
    		return m_size;
    	}
    	bool empty()
    	{
    		if(m_item==0)
    			return true;
    		else
    			return false;
    	}
    private:
    	ElemType *m_base;
    	ElemType *m_top;
    	int m_size;
    	int m_item;
    };
    void ChangeExp(char *inexp,char *sufexp)//中缀转后缀
    {
    	int i=0;
    	int j=0;
    	Stack<char> stack;
    	while (1)
    	{
    		if(inexp[i]=='\0')
    		{
    			while(!stack.empty())
    				stack.pop(sufexp[j++]);
    			sufexp[j]='\0';
    			break;
    		}
    		char e=inexp[i++];
    		if(e>='0'&&e<='9')
    		{
    			sufexp[j++]=e;
    			continue;
    		}
    		if('*'==e||'/'==e||'('==e)
    			stack.push(e);
    		else if(')'==e)
    		{
    			char c=' ';
    			stack.pop(c);
    			while('('!=c)
    			{
    				sufexp[j++]=c;
    				stack.pop(c);
    			}
    		}
    		else if('+'==e||'-'==e)
    		{
    			char c=' ';
    			while('('!=c&&!stack.empty())
    			{
    				stack.pop(c);
    				if('('!=c)
    					sufexp[j++]=c;
    			}
    			if('('==c)
    				stack.push(c);
    			stack.push(e);
    		}
    
    	}
    }
    int Calculate(char *exp)//计算表达式的值
    {
    	int i=0;
    	Stack<int> stack;
    	int num1;
    	int num2;
    	while(exp[i]!='\0')
    	{
    		if(exp[i]>='0'&&exp[i]<='9')
    			stack.push(exp[i]-'0');
    		else
    		{
    			stack.pop(num1);
    			stack.pop(num2);
    			switch(exp[i])
    			{
    			case '+':
    				stack.push(num2+num1);
    				break;
    			case '-':
    				stack.push(num2-num1);
    				break;
    			case '*':
    				stack.push(num2*num1);
    				break;
    			case '/':
    				stack.push(num2/num1);
    				break;
    			}
    		}
    		i++;
    	}
    	int result;
    	stack.pop(result);
    	return result;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char inexp[EXPLENGHT];
    	char sufexp[EXPLENGHT];
    	cout<<"输入中缀表达式(最大长度20):"<<endl;
    	cin>>inexp;
    	ChangeExp(inexp,sufexp);
    	cout<<"后缀表达式:"<<endl;
    	cout<<sufexp<<endl;
    	cout<<"运算结果:"<<Calculate(sufexp)<<endl;
    	system("pause");
    	return 0;
    }
    


  • 相关阅读:
    字典_序列解包用于列表元组字典
    字典_序列解包用于列表元组字典
    字典_元素的访问_键的访问_值的访问_键值对的访问
    字典_特点_4种创建方式_普通-dict
    元组_生成器推导式创建元组-总结
    MySql高级
    技术点
    全文检索ElasticSearch
    数仓管理
    SpringCache
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3108931.html
Copyright © 2011-2022 走看看