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;
    }
    


  • 相关阅读:
    HTML DOM 12 表格排序
    HTML DOM 10 常用场景
    HTML DOM 10 插入节点
    HTML DOM 09 替换节点
    HTML DOM 08 删除节点
    HTML DOM 07 创建节点
    022 注释
    024 数字类型
    005 基于面向对象设计一个简单的游戏
    021 花式赋值
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3108931.html
Copyright © 2011-2022 走看看