스 택 의 응용 - 표현 식 값 구하 기

4189 단어 데이터 구조
이것 은 데이터 구 조 를 배 울 때 쓴 코드 입 니 다. 표현 식 값 을 구 합 니 다.
산술 표현 식 에 대해 연산 자 우선 법 으로 값 을 구 하 는 과정 을 보 여 주 는 프로그램 을 설계 합 니 다.연산 자 우선 관 계 를 이용 하여 산술 네 가지 혼합 연산 식 에 대한 값 을 구 합 니 다.(1) 입력 형식: 표현 식, 예 를 들 어 2 * (3 + 4)     포 함 된 연산 자 는 '+', '-', '*', '/', '(', ')' 만 있 을 수 있 습 니 다.(2) 출력의 형식: 연산 결과, 예 를 들 어 2 * (3 + 4) = 14;
(3) 프로그램 이 수행 할 수 있 는 기능: 표현 식 에 값 을 구하 고 출력 합 니 다.
#include 
#include "touwenjian.h"
#include 
#include 
int main()
{
	char m;
	cout << "      ,    + - * / % ^        :T3  10^3" << endl;
	Calculator cal;
	cal.Run();
	cout << "    y    ,      " << endl;
	cin >> m;
	while (m=='y')
	{
		switch (m)
		{
		case 'y': 
		{
			cal.Run();
			cout << "    y    ,      " << endl;
			cin >> m;
			break;
		}
		}
	}
	getchar();
	getchar();
	return 0;
}
#ifndef _TOUWENJIAN_H
#define _TOUWENJIAN_H

#include 
#include "sq_stack.h"
#include "utility.h"
#include "lk_stack.h"
#include "node.h"
#include  

template
class Calculator
{
private:
	LinkStackopnd;
	LinkStackoptr;
	bool IsOperator(char ch);
	int OperRank(char op,char np);
	double Operate(double left, char zhongjian, double right);

public:
	void Run();
	Calculator() {};
	virtual ~Calculator() {};
	


};
template
void Calculator ::Run()
{
	optr.Clear();
	opnd.Clear();
	optr.Push('=');
	opnd.Push(0);
	char ch;
	char op;
	char np;
	double a1, a2, a3, shuzi;
	ElemType operand;
	ch = getchar();
	char optrTop;
	optr.Top(optrTop);
	while (optrTop != '=' || ch != '=')
	{
		if (!IsOperator(ch))
		{
			cin.putback(ch);
			cin >> operand;
			opnd.Push(operand);
			cin >> ch;
		}
		else
		{
			if (OperRank(optrTop,ch)==-1)
			{
				optr.Push(ch);
				cin >> ch;
			}	
			else if (OperRank(optrTop, ch) == 1)
			{
				opnd.Pop(a1);
				opnd.Pop(a2);
				optr.Pop(optrTop);
				shuzi = Operate(a2, optrTop, a1);
				opnd.Push(shuzi);
			}
			else if (OperRank(optrTop, ch) == 0 )
			{
				optr.Pop(optrTop);
				cin >> ch;
			}
			else cout << "     " << endl;
		}
		optr.Top(optrTop);
	}
	opnd.Pop(a3);
	cout << a3 << endl;

}
template
bool Calculator ::IsOperator(char ch)
{
	if (ch != '+'&&ch != '-'&&ch != '='&&ch != '*'&&ch != '/'&&ch != '('&&ch != ')'&&ch != '%'&&ch != '^'&&ch != 'T')
		return false;
	else return true;
}
template
int Calculator ::OperRank(char op,char np)
{
	int x, y;
	if (op == '+' || op == '-') x=3;
	if (op == '*' || op == '/'||op=='%') x=5;
	if (op == '(') x = 1;
	if (op == ')') x = 6;
	if (op == '=') x = 0;
	if (op == 'T') x = 8;
	if (op == '^') x = 12;
	if (np == '+' || np == '-') y=2;
	if (np == '*' || np == '/' || np == '%') y = 4;
	if (np == '(') y = 6;
	if (np == ')') y = 1;
	if (np == '=') y = 0;
	if (np == 'T') y = 7;
	if (np == '^') y = 11;
	if (x > y)
		return 1;
	else if (x < y)
		return -1;
	else return 0;

}
template
double Calculator ::Operate(double right, char zhongjian, double left)
{
	switch(zhongjian)
	{
		case '+': return right + left;
			break;
		case '-': return right - left;
			break;
		case '*': return right * left;
			break;
		case '/': return right/left;
			break;
		case '%': return int(right)%int(left); 
			break;
		case 'T':return right*(pow(10.0, left));
			break;
		case '^':return pow(right, left);
			break;
	}
}



#endif // !_TOUWENJIAN_H

좋은 웹페이지 즐겨찾기