창고 의 응용 - 표현 식 값 구하 기 - 데이터 구조

3485 단어 데이터 구조
스 택 의 응용 중 하나 입 니 다. 표현 식 의 값 을 구 합 니 다. 엄 혜 민 책 에서 준 예 는 한 자릿수 만 입력 하 는 것 입 니 다. 여기 서 조금 만 고 쳐 서 여러 비트 의 +, -, *, / 를 처리 합 니 다.
표현 식 은 입력 이 합 법 적 이 고 나 누 기 는 정리 할 수 있어 야 합 니 다. 그렇지 않 으 면 int 가 떨 어 지고 계산 이 틀 렸 습 니 다. 주로 책 에서 우선 순위 표 의 응용 입 니 다.
STATUS 의 귀환 을 줄 이 고 ERROR 라 니. OK  오 버 플 로 우 거.
전체 코드:
#include
#include
#include

#define InitStackSize 100
#define Increase 100


typedef struct SqcharStack
{
	char *base,*top;
	int stacksize;	
}SqcharStack;

typedef struct SqintStack
{
	int *base,*top;
	int stacksize;
}SqintStack;

void InitcharStack(SqcharStack &s)
{
	s.base=s.top=(char*)malloc(InitStackSize*sizeof(char));
	s.stacksize=InitStackSize;
}

void InitintStack(SqintStack &s)
{
	s.base=s.top=(int*)malloc(InitStackSize*sizeof(int));
	s.stacksize=InitStackSize;
} 

void PushcharStack(SqcharStack &s,char key)  //    
{
	if(s.top-s.base>=s.stacksize)
	{
		s.base=(char*)realloc(s.base,(s.stacksize+Increase)*sizeof(char));
		s.top=s.base+s.stacksize;
		s.stacksize+=Increase;
	}
	*s.top=key;
	s.top++;
}

void PushintStack(SqintStack &s,int key) //    
{
	if(s.top-s.base>=s.stacksize)
	{
		s.base=(int*)realloc(s.base,(Increase+s.stacksize)*sizeof(int));
		s.top=s.base+s.stacksize;
		s.stacksize+=Increase;
	}
	*s.top=key;
	s.top++;
}

char GetcharStackTop(SqcharStack S)
{
	char e;
	e=*--S.top;
	return e;
}

int GetintStackTop(SqintStack S)
{
	int e;
	e=*--S.top;
	return e;
}

int In(char a,char sym[])
{
	int i;
	for(i=0;i<7;i++)
		if(sym[i]==a) return 1;	
	return 0;
}

void PopcharStack(SqcharStack &s)
{
	s.top--;
}

void PopintStack(SqintStack &s)
{
	s.top--;
}


char Precede(char a,char b,char pr[][10])  //      
{
	int i,j;
	switch(a)
	{
		case '+':i=0;break;
		case '-':i=1;break;
		case '*':i=2;break;
		case '/':i=3;break;
		case '(':i=4;break;
		case ')':i=5;break;
		case '=':i=6;break;
		default:break;
	}
	switch(b)
	{
		case '+':j=0;break;
		case '-':j=1;break;
		case '*':j=2;break;
		case '/':j=3;break;
		case '(':j=4;break;
		case ')':j=5;break;
		case '=':j=6;break;
		default:break;
	}
	return pr[i][j];
}

int Operate(int a,int b,char ch)
{
	switch(ch)
	{
		case '+':return b+a;break;
		case '-':return b-a;break;
		case '*':return b*a;break;
		case '/':return b/a;break;
		default:break;
	}
}

int main()
{
	SqcharStack OPTR;
	SqintStack OPND;
	char str[101];
	int i,k,j,byt,num,temp,len;
	int a,b; 
	char theta;
	char pre[][10]={
	{'>','>','','>'},
	{'>','>','','>'},
	{'>','>','>','>','','>'},
	{'>','>','>','>','','>'},
	{'','>','>','>','0','>','>'},
	{'':
					theta=GetcharStackTop(OPTR); //        
					PopcharStack(OPTR);
					a=GetintStackTop(OPND);
					PopintStack(OPND);
					b=GetintStackTop(OPND);
					PopintStack(OPND);
					PushintStack(OPND,Operate(a,b,theta)); //    a,b  ,             
					break;
				}
				
			} 
		}//while( || )
		printf("The result is:%d
",GetintStackTop(OPND)); } return 0; } /* 123+456= 4+5*6-10= (2+8)*6/5= 100/2/2/5= */

좋은 웹페이지 즐겨찾기