UVa 327 - Evaluating Simple C Expressions
4733 단어 express
3763
30.56%
1145
70.66%
제목 링크:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=263
샘플 입력:
a + b
b - z
a+b--+c++
c+f--+--a
f-- + c-- + d-++e
샘플 출력:
Expression: a + b
value = 3
a = 1
b = 2
Expression: b - z
제목 의 대의:
표현 식 을 주 십시오.표현 식 의 변 수 는 26 개의 소문 자로 구성 되 어 있 습 니 다.이 26 개의 자 모 는 순서대로 초기 값 을 1,2,3,...26 으로 나 누고 표현 식 의 변 수 는 중복 되 지 않 습 니 다.연산 자 는+,-,+,-(자체 증가 와 자체 감소 에 접두사 와 접두사 가 있 습 니 다).
그리고 이 표현 식 의 값 을 출력 하고 나타 나 는 변수 마다 값 을 계산 합 니 다.
문제 풀이 방향:
데이터 구조 주제 이기 때문에 처음에 자 연 스 럽 게 나 무 를 만 드 는 방법 이 생각 났 다.
방법 을 생각해 본 후에 코드 를 두 드 리 기 시작 했다.나 무 를 만 드 는 코드 를 다 두 드 리 고 결 과 를 계산 하려 고 할 때 이 문 제 는 나 무 를 만 들 필요 가 없고 더 간단 하 다 는 것 을 알 게 되 었 다.
어떤 방법 이 든 문 제 를 푸 는 기본 적 인 사 고 는 표현 식 의 접두사+를 먼저 처리 한 다음 에 왼쪽 에서 오른쪽으로 계산 하면 결 과 를 얻 을 수 있다 는 것 이다.
다음은 비 건 트 리 코드 입 니 다.
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<deque>
#include<vector>
#include<algorithm>
using namespace std;
vector<char>var;
deque<int>que;
const int MAXN = 120;
char str[MAXN];
int val[26]; // a,b,……z
int increment;
// ,
void Filter(){
int pos=0;
for(int i=0; i<strlen(str); ++i){
if(str[i] != ' '){
str[pos++] = str[i];
}
}
str[pos] = 0; // '\0'
}
//
inline bool havePrefix(int i){
if(str[i-1]=='+'&&str[i-2]=='+' || str[i-1]=='-'&&str[i-2]=='-')
return true;
return false;
}
//
inline bool haveSuffix(int i){
if(str[i+1]=='+'&&str[i+2]=='+' || str[i+1]=='-'&&str[i+2]=='-')
return true;
return false;
}
void PreProsess(){
increment = 0;
while(!que.empty()) que.pop_back();
var.clear();
for(int i=0; i<strlen(str); ++i){
if(str[i]>='a' && str[i]<='z'){
//
var.push_back(str[i]); //
if(i>=2 && havePrefix(i)){
if(str[i-1]=='+')
++val[str[i]-'a'];
else
--val[str[i]-'a'];
int n = val[str[i]-'a'];
que.push_back(n);
str[i-1]=str[i-2] = ' ';
}
//
else if(i<=strlen(str)-3 && haveSuffix(i)){
int n = val[str[i]-'a'];
que.push_back(n);
if(str[i+1]=='+'){
++val[str[i]-'a'];
--increment;
}
else{
--val[str[i]-'a'];
++increment;
}
str[i+1] = str[i+2] = ' ';
}
else {
int n = val[str[i]-'a'];
que.push_back(n);
}
}
}
}
int GetSum(){
for(int i=0; i<strlen(str); ++i){
if(str[i]=='+' || str[i]=='-'){
int a=que.front();
que.pop_front();
int b=que.front();
que.pop_front();
if(str[i]=='+')
que.push_front(a+b);
else
que.push_front(a-b);
}
}
return que.front();
}
void Solve(){
// a,b,c……z
for(int i=0; i<26; ++i){
val[i] = i+1;
}
Filter();
PreProsess();
int sum = GetSum();
// puts(str);
printf(" value = %d
", sum);
sort(var.begin(), var.begin()+var.size());
for(int i=0; i<var.size(); ++i){
printf(" %c = %d
",var[i], val[var[i]-'a']);
}
// printf("
");
}
int main(){
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
while(gets(str)){
printf("Expression: %s
", str);
Solve();
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
express를 사용하여 AWS S3 이미지에 액세스하기 위해 미리 서명된 URL을 생성하는 방법은 무엇입니까?이를 달성하는 방법 중 하나는 미리 서명된 URL을 사용하는 것입니다. However, the object owner can optionally share objects with others by creating a...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.