C++primer--stack 처리 괄호 표현식(순서 컨테이너)
#include<iostream>
#include<string>
#include<stack>
#include<stdexcept>
#include<deque>
using namespace std;
enum obj_type {LP,RP,ADD,SUB,VAL};
struct obj
{
obj(obj_type type, double val = 0) { t = type; v = val; }
obj_type t;
double v;
};
inline void skipws(string &exp, size_t &p)
{
p = exp.find_first_not_of(" ", p);
}
inline void new_val(stack<obj>&so, double v)
{
if (so.empty()||so.top().t==LP)
{
so.push(obj(VAL, v));
}
else if (so.top().t == ADD || so.top().t == SUB)
{
obj_type type = so.top().t;
so.pop();
if (type == ADD)
v += so.top().v;
else
v = so.top().v - v;
so.pop();
so.push(obj(VAL, v));
}
else
throw invalid_argument(" ");
}
int main(int argc, char **argv)
{
stack<obj>so;
string exp;
size_t p = 0, q;
double v;
cout << " " << endl;
getline(cin, exp);
while (p<exp.size())
{
skipws(exp, p);
if (exp[p]=='(')
{
so.push(obj(LP));
p++;
}
else if ((exp[p] == '+') || exp[p] == '-')
{
if (so.empty() || so.top().t != VAL)
throw invalid_argument(" ");
if (exp[p] == '+')
so.push(obj(ADD));
else
so.push(obj(SUB));
p++;
}
else if (exp[p]==')')
{
p++;
if (so.empty())
throw invalid_argument(" ");
if (so.top().t == LP)
throw invalid_argument(" ");
if (so.top().t == VAL)
{
v = so.top().v;
so.pop();
if (so.empty() || so.top().t != LP)
throw invalid_argument(" ");
so.pop();
new_val(so, v);
}
else
throw invalid_argument(" ");
}
else
{
v = stod(exp.substr(p), &q);
p += q;
new_val(so, v);
}
}
if (so.size()!=1||so.top().t!=VAL)
{
throw invalid_argument(" ");
}
cout << so.top().v << endl;
system("pause");
return 0;
}
제목은 +-() 네 가지로 가정하고 창고의 창고에서 창고를 꺼내 전체 표현식을 연산한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
vue 단일 페이지에 여러 개의 echarts 도표가 있을 때의 공용 코드 쓰기html에서: 데이터 처리는 말할 필요가 없다.응, 직접 그림을 그려: 공통 섹션: 이 페이지를 떠날 때 파괴: 추가 정보: Vue + Echarts 차트 표시 및 동적 렌더링 준비 작업 echarts 의존 설치 n...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.