[데이터 구조] 접미사 표현 식 을 이용 하여 표현 식 의 값 을 구하 십시오.

목표:
접미사 표현 식 을 접미사 표현 식 으로 바 꾸 고 값 을 구 합 니 다.
난점:
1. 숫자 와 기호의 구분 과 추출.2. 숫자 와 기호의 선형 저장 3. 실수 추출, 전환 과 처리.
4. 괄호, 음수 추출 과 처리.
데이터 구조:
변 환 된 접미사 표현 식 에는 정수, 실수, 기호 등 여러 가지 요소 가 있 기 때문에 간단 한 선형 배열 에 존재 할 수 없 기 때문에 구조 체 배열 S [N] 로 접미사 표현 식 을 저장 합 니 다. 각 구조 체 STR 에는 각각 int 변수 가 정수, float 변 량 저장 실수, char 변수 저장 기호 가 있 고 다른 int 아래 표 시 를 사용 합 니 다.
이 구조 체 에 저 장 된 것 은 기호, 정수, 실수 입 니까?
구체 적 인 실현:
처리 해 야 할 것 이 비교적 많 기 때문에 단계별 로 실현 하 는 방식 을 취한 다. 1. 비교적 간단 한 정 수 를 먼저 실현 한다.
첫 번 째 단 계 는 괄호 도 실수 도 음수 도 없 는 가장 간단 한 상황 이다.하지만 첫 번 째 단 계 는 전 체 를 완성 해 야 한다.
프로그램의 틀.
a) 우선 접미사 표현 식 의 처리 와 전환 입 니 다.
먼저 string 형식의 문자열 r1 로 숫자 를 잠시 저장 합 니 다.string 형식의 r2 를 사용 합 니 다.
기호 창고.그리고 처음부터 끝까지 스 캔 을 합 니 다.누 군 가 를 쓸 때 두 가지 상황 이 발생 합 니 다.
1) 이 자 리 는 숫자
이것 은 현재 비트 가 숫자의 일부분 임 을 나타 내 며 r1 에 눌 러 넣 습 니 다.
2) 이 자 리 는 기호
이것 은 이미 어떤 숫자 를 스 캔 하 였 음 을 나타 낸다. r1 에 처리 해 야 할 숫자 가 하나 있 는데, 이때
r1 을 정수 로 바 꾸 고 총 항 수 를 누적 하여 S 에 넣 고 태그 변 수 를 0 으로 설정 하 는 것 은 이것 이 하나의 것 임 을 나타 낸다.
숫자
이 동시에 문자 스 택 r2 에서 스 택 꼭대기 부터 우선 순위 가 현재 위치 보다 큰 기 호 를 만나면
스 택 에서 나 와 총 항목 을 누적 하고 S 에 저장 합 니 다. 태그 변 수 는 1 로 설정 되 어 있 습 니 다. 이것 은 기호 입 니 다.내 내
우선 순위 가 크 지 않 을 때 까지 창고 에 들 어 갑 니 다.
마지막 단 계 는 r1 을 초기 화하 여 새로운 숫자 를 저장 하 는 것 입 니 다.
b) 스 캔 이 끝 난 후 연산 단계 에 들어간다.
S 를 스 캔 하고 숫자 를 만나면 스 택 에 들 어가 고 기호 에 따라 스 택 에서 두 요 소 를 계산 하 며 계산 결 과 를 다시 스 택 에 들 어 갑 니 다.하나.
S 끝 날 때 까지
마지막 으로 스 택 상단 의 요 소 를 출력 합 니 다.즉 결과.
2. 실수 처리 읽 기 과정 에서 String 형식의 문자열 숫자 호 환 함수 사용 이 편리 하기 때문에 함수 로 직접 실 수 를 처리 합 니 다.1 의 판단 만 수정 하면 "."을 만 났 을 때 종료 하지 않 고 계속 누적 합 니 다. 연산 자 를 만 났 을 때 저장 할 때 태그 변 수 를 2 로 설정 하여 실 수 를 표시 합 니 다.계산 과정 에서 '%' 조작 수의 유형 은 int 로 설정 하고 '/' 조작 수의 유형 은 float 로 설정 해 야 합 니 다.3. 괄호 의 처리 와 판단 을 넣 고 읽 는 과정 에서 왼쪽 괄호 는 처리 하지 않 고 바로 창고 에 들어간다.오른쪽 괄호 를 눌 렀 을 때 왼쪽 괄호 를 만 날 때 까지 스 택 을 나 갑 니 다.계산 과정 중 에는 특별한 처리 가 필요 없다.4. 마이너스 추출 과 처 리 를 추가 합 니 다.읽 는 과정 에서 하나의 태그 변 수 를 가 져 와 서 모든 숫자 가 양수 인지 마이너스 인지 표시 합 니 다. 이 변 수 는 기본 값 은 1 이 고 정 수 를 대표 합 니 다."-"를 만나면 첫 번 째 와 다음 을 판단 합 니 다.앞 자리 가 숫자 라면 감호 로 기록 하고 앞 자리 가 숫자 가 아니라면 뒷 자리 가 숫자 라면 기호 임 을 나타 낸다.태그 변 수 를 - 1 로 설정 합 니 다.마지막 으로 한 자리 가 있 는 숫자 를 처리 할 때 결 과 를 - 1 에 곱 하고 저장 하 며 마지막 으로 태그 변 수 를 1 로 초기 화 합 니 다.계산 과정 중 에는 특별한 처리 가 필요 없다.5. 몇 가지 특수 상황 고려
a)   –(a+b)
0 – (a + b) 로 변환 합 니 다.
- "먼저 창고 에 들 어가 고 마지막 에 창고 에서 나 갑 니 다."계산 할 때 창고 바닥 을 먼저 0 으로 눌 러 넣다.
b)  기타 상황
이미 4 단계 전에 고려 했다.
CODE:
#include
#include
#include
#include
#include
#define N 200
using namespace std;
typedef struct STR
{
	int bj;			//    ,     
	int num; 		//     
	float flo;		//     
	char fh;		//     
} ;
int su=0;
STR S[N];
//    ,             ,              (      )
//            ,        ,              。
void init()
{
	int cmpn[N];
	cmpn[(int)'-']=1;
	cmpn[(int)'+']=1;
	cmpn[(int)'*']=2;
	cmpn[(int)'/']=2;
	cmpn[(int)'%']=2;
	cmpn[(int)'^']=3;
	cmpn[(int)'(']=0;
	string f;
	cin>>f;
	string r1="",r2="";
	int ii=0;
	int fla=1;
	int fl2=0;
	for (int i=0;i='0' && f[i]<='9' )
		r1+=f[i];
		else if (f[i]=='.')			//     
		{
			r1+=f[i];
			fl2=1;
		}
		else
		{
			//       
			if ( (f[i]=='-') && ( (f[i+1]>='0' && f[i+1]<='9'&&!(f[i-1]>='0' && f[i-1]<='9')  )|| i==0))
			{
				if (f[i+1]>='0' && f[i+1]<='9')
				{
					fla*=-1;
					continue;
				}
				else if  (f[i+1]=='(')
				{
					r2[ii]=f[i];
					ii++;
					continue;
				}
			}
			if (f[i-1]>='0' && f[i-1]<='9')
			{
			if (fl2==0)
			{
	 		int n = atoi(r1.c_str());
	 		n*=fla;
	 		fla=1;
			cout<=cmpn[(int)ff])
					{
						if (ii==0)break;
						cout<='0'&&f[f.length()-1]<='9')
			{
			if (fl2==0)
			{
	 		int n = atoi(r1.c_str());
	 		n*=fla;
	 		fla=1;
			cout<0)
	{
		cout<

좋은 웹페이지 즐겨찾기