창고 로 사 칙 연산 문 제 를 해결 하 다
주의해 야 할 것 은 책 에서 접미사 표현 식 접미사 전환 에 관 한 설명 이 명확 하지 않다 는 것 이다.본인 도 이곳 에서 약간의 시간 을 들 여 잘못된 원인 을 퇴고 했 고, 인터넷 에서 도 이 글 을 찾 아 냈 으 며, 접두사 가 접 두 사 를 바 꾸 는 규칙 을 비교적 잘 소개 하 였 다.
원리:
컴퓨터 로 사 칙 연산 을 풀 면 스 택 을 사용 할 수 있다.스 택 의 '선진 후 출' 특성 때문에 접미사 표현 식 을 통 해 네 가지 연산 식 의 결 과 를 계산 할 수 있 습 니 다.접미사 표현 식 의 전환 도 스 택 을 사용 하여 접미사 표현 식 을 조작 하여 전환 할 수 있 습 니 다.뚜렷하게 접미사 표현 식 - 접미사 표현 식, 접미사 표현 식 - 식 으로 결 과 를 얻 을 수 있 습 니 다.창고 까지 사용 해 야 합 니 다.그래서 인 코딩 실현 에서 우 리 는 이 두 과정 을 실현 하 는 함수 (infix to suffix (), suffix to result () 에 중심 을 두 었 다.
주의:
테스트 데이터
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAXSIZE = 100;
//
typedef struct
{
int data[MAXSIZE];
int top;
} Stack;
int table[] = {0,0,2,1,0,1,0,2};//
// :
// :
//sta:
//infix:
//suffix:
//length:
void infix_to_suffix(Stack *sta, char *infix, int *suffix, int *length);
// :
// :
//sta:
//suffix:
//length:
int suffix_to_result(Stack *sta, int *suffix, int length);
void init(Stack *sta);//
int main()
{
//
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
Stack sta;
int length;
int result; //
int sstr[MAXSIZE]; //
char istr[MAXSIZE]; //
printf(" + - * /
( )
");
scanf("%s", istr);
init(&sta); //
infix_to_suffix(&sta, istr, sstr, &length);
init(&sta); //
result = suffix_to_result(&sta, sstr, length);
printf("%d
", result);
// fclose(stdin);
// fclose(stdout);
return 0;
}
void infix_to_suffix(Stack *sta, char *infix, int *suffix, int *length)
{
int i; //
int b = 0; //
int j = 0; //suffix
int priority = 0; //
//for i++, suffix i++
for (i = 0; i < strlen(infix); )
{
// , suffix , continue
if (infix[i] >= '0' && infix[i] <= '9')
{
b = 0; // !
while (infix[i] >= '0' && infix[i] <= '9')
{
b = b * 10 + (infix[i] - '0');
i++;
}
suffix[j] = b;
j++;
continue;
}
// , , continue
if (infix[i] == 41)
{
while (sta->data[sta->top] != 40)
{
suffix[j] = sta->data[sta->top];
sta->data[sta->top] = 0;
sta->top--;
j++;
}
sta->data[sta->top] = 0;
sta->top--;
// ,
priority = table[sta->data[sta->top] % 10];
i++;
continue;
}
// ,
if (infix[i] == 40)
{
sta->top++;
sta->data[sta->top] = infix[i];
// ,
priority = table[sta->data[sta->top] % 10];
i++;
continue;
}
// ,
if (infix[i] >= 42 && infix[i] <= 47)
{
//
// , ,
if (priority >= table[infix[i] % 10])
{
while (priority >= table[infix[i] % 10] && sta->data[sta->top] != 40)
{
suffix[j] = sta->data[sta->top];
sta->data[sta->top] = 0;
sta->top--;
// ,
priority = table[sta->data[sta->top] % 10];
j++;
}
sta->top++;
sta->data[sta->top] = infix[i];
// ,
priority = table[sta->data[sta->top] % 10];
i++;
}
else
{
//
if (infix[i] == 45 && sta->data[sta->top] == 40)
{
b = 0;
while (infix[i+1] >= '0' && infix[i+1] <= '9')
{
b = b * 10 + (infix[i+1] - '0');
i++;
}
suffix[j] = b * -1;
sta->data[sta->top] = 0;
sta->top--;
j++;
i += 2;
priority = table[sta->data[sta->top] % 10];
continue;
}
sta->top++;
sta->data[sta->top] = infix[i];
// ,
priority = table[sta->data[sta->top] % 10];
i++;
}
}
}
//
while (sta->top != -1)
{
suffix[j] = sta->data[sta->top];
sta->top--;
j++;
}
*length = j;
}
int suffix_to_result(Stack *sta, int *suffix, int length)
{
int i;
int j;
int result = 0;
for (i = 0; i < length; i++)
{
// , , ,
switch (suffix[i])
{
case 42:
result = sta->data[sta->top - 1] * sta->data[sta->top];
sta->top -= 1;
sta->data[sta->top] = result;
break;
case 43:
result = sta->data[sta->top - 1] + sta->data[sta->top];
sta->top -= 1;
sta->data[sta->top] = result;
break;
case 45:
result = sta->data[sta->top - 1] - sta->data[sta->top];
sta->top -= 1;
sta->data[sta->top] = result;
break;
case 47:
result = sta->data[sta->top - 1] / sta->data[sta->top];
sta->top -= 1;
sta->data[sta->top] = result;
break;
default:
sta->top++;
sta->data[sta->top] = suffix[i];
break;
}
}
return result;
}
//
void init(Stack *sta)
{
int i;
for (i = 0; i < MAXSIZE; i++)
{
sta->data[i] = 0;
}
sta->top = -1;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.