스 택 의 응용 - 표현 식 값 구하 기
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.