zoukankan      html  css  js  c++  java
  • 数据结构算数表达式求值

    #include "pch.h"
    #include <windows.h>
    #include <iostream>
    #include <stack>
    using std::stack;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::cerr;
    /*    
    	  0 1 2 3 4 5 6
     	  + - * / ( ) #
      0	+ > > < < < > >
      1	- > > < < < > >
      2	* > > > > < > >
      3	/ > > > > < > >
      4	( < < < < < = 
      5	) > > > >   > >
      6	# < < < < <   =
    */
    /*
    	> 2
    	< 1
    	= 0
    */
    
    BYTE order[7][7] = {
    	{2,2,1,1,1,2,2},
    	{2,2,1,1,1,2,2},
    	{2,2,2,2,1,2,2},
    	{2,2,2,2,1,2,2},
    	{1,1,1,1,1,0,255},
    	{2,2,2,2,255,2,2},
    	{1,1,1,1,1,255,0}
    };
    int Getloc(char achar) {
    	switch (achar) {
    	case '+':
    		return 0;
    	case '-':
    		return 1;
    	case '*':
    		return 2;
    	case '/':
    		return 3;
    	case '(':
    		return 4;
    	case ')':
    		return 5;
    	case '#':
    		return 6;
    	}
    	return -1; //会引发异常
    }
    int domath(int a, char opt, int b) {
    	switch (opt) {
    	case '+':
    		return a + b;
    	case '-':
    		return a - b;
    	case '*':
    		return a * b;
    	case '/':
    		if (b == 0)
    		{
    			throw "Division by zero condition!";
    		}
    		return a / b;
    	}
    	return -1;
    }
    char transorder(char top, char c) {
    	int x, y;
    	y = Getloc(top);
    	x = Getloc(c);
    	return order[y][x];
    }
    int main()
    {
    	stack<char> OPTR;
    	stack<int> OPND;
    	char c;
    	OPTR.push('#');
    	c = getchar();
    	BOOL ISNUMBER = FALSE;
    	while (c != '#' || OPTR.top()!='#') {
    		if (c >= '0' && c <= '9') {
    			if (ISNUMBER) {
    				int tmp = OPND.top();
    				OPND.pop();
    				OPND.push(tmp * 10 + c - '0');
    				c = getchar();
    				continue;
    			}
    			ISNUMBER = TRUE;
    			OPND.push(c - '0');
    			c = getchar();
    		}
    		else {
    			ISNUMBER = FALSE;
    			switch (transorder(OPTR.top(), c)) {
    			case 1:
    				OPTR.push(c);
    				c = getchar();
    				break;
    		
    			case 0:
    				OPTR.pop();
    				c = getchar();
    				break;
    
    			case 2:
    				int a, b;
    				char opt = OPTR.top();
    				OPTR.pop();
    				b = OPND.top();
    				OPND.pop();
    				a = OPND.top();
    				OPND.pop();
    				try {
    					OPND.push(domath(a,opt,b));
    				}
    				catch (const char * e) {
    					cerr << e << endl;
    					return 0;
    				}
    				break;
    			}
    		}
    	}
    	cout << OPND.top();
    	return 0;
    }
    

     哎 写的时候把操作数的类型也写成char了 debug半天。。。

  • 相关阅读:
    js 获取浏览器版本号
    怎样写具体设计文档
    android PreferenceScreen使用笔记
    支持向量机通俗导论(理解SVM的三层境地)
    算法导论 第6章 堆排序(简单选择排序、堆排序)
    人脸识别算法初次了解
    循环队列
    ubuntu 下操作文件夹,出现Permission denied的解决的方法
    JFreeChart的使用
    隐藏Activity标题栏
  • 原文地址:https://www.cnblogs.com/BD1A489/p/9798640.html
Copyright © 2011-2022 走看看