/************혹여나 과제제출하려고 긁어가는거면 ...비추입니다...*****/
/******배열까지밖에 안배우고 군대갔다왔는데 갑자기 스텍이라니!!!!!!!!*****/
/*********최적화되지 않은 프로그램입니다 ㅋㅋ**************************/
/***********************암튼 퍼가시는거 비추 ㅋㅋㅋ******************/
/**************주기싫어서그러는게아니라 퍼가신분혼날까봐 ㅋㅋ******/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define STACK_LEN 15
typedef char Data;
typedef struct{
Data stackArr[STACK_LEN];
int top;
}ArrayStack;
typedef ArrayStack Stack;
void init(Stack *pstack){
pstack->top=-1;
}//top 초기화
int isEmpty(Stack *pstack){
if( pstack->top ==-1)
return 1;
else return 0;
}//빈스텍인지 검사
void push(Stack *pstack,Data data){
pstack->top +=1;
pstack->stackArr[pstack->top]=data;
}//push. top증가후 데이터삽입
Data pop(Stack *pstack){
char temp,temp2;
if (isEmpty(pstack)==1){
printf(" Empty stack");
}
temp=pstack->top; //top의 int값을 temp로 저장
pstack->top -=1;
temp2=pstack->stackArr[temp]; //int값으로 직전의 top이가리키던값 리턴
pstack->stackArr[temp]=0;
return temp2; //int값으로 직전의 top이가리키던값 리턴
}//pop.
Data peek(Stack *pstack){
if (pstack->top==-1){
printf("Stack is emtpy3\n");
}
else return pstack->stackArr[pstack->top];
}
void deleteElement(Stack *pstack){
if (pstack->top==-1) {
printf("Stack is emtpy");
}
else{
pstack->stackArr[pstack->top]=0;
pstack->top -=1;
}
}
/*********************여기까지 스텍관련함수들*********************/
int checkPIS(char peeking){
int pis=0;
if (peeking=='*' || peeking=='/') {
pis=3;}
else if ( peeking=='+' || peeking=='-' ){
pis=2;}
else if( peeking=='('){
pis=1; }
return pis;
}
int checkPIE(char tk){
int pie;
if (tk=='*' || tk=='/') {
pie=3; }
else if (tk=='+' || tk=='-') {
pie=2; }
else if (tk=='(' ){
pie=4;}
return pie;
}/***********************여기까지 PIS,PIE cheking **********/
int main(void){
char tmp[20];
char exptemp[15]={NULL};//후위표기후 출력값이 저장되는 배열
int i=0,j=0,t=0,cnt=1,expcount=0,popcount=0;
// j출력카운트 cnt는 전체while문돌리기위한 cnt. t는 푸쉬하면 ++
char tk,peeking;
Stack stack;
stack.stackArr[STACK_LEN]=NULL;
init(&stack);
printf("수식을 입력하시오 : ");
scanf("%s",tmp);
while(cnt !=0){
tk=tmp[i]; //gettoken의 역할을 한다
printf("수식: %s 토큰값: %c\n스택값: ",tmp,tk);puts(stack.stackArr);
printf("카운트 : %d\n",i);
if (tk==')'){
while( peek(&stack) != '('){
exptemp[expcount]=pop(&stack);
popcount++; expcount++;
}
if (peek(&stack)=='('){ //'('와')'사이에 아무값도없는경우 스텍속의 '('를 삭제합니다
deleteElement(&stack);
if ( peek(&stack)!='('){ //만약 삭제된'('앞에 또 '('가 없을시에는 삭제된 (의 앞의 오퍼렌드를 팝합니다. 그이유는 이 조건문을 안걸어주면 다중으로 괄호가 걸려있을시 두개의 괄호 모두를 팝해버리기 때문입니다.
exptemp[expcount]=pop(&stack);
popcount++; expcount++;
}
}//괄호비교후 '('를 지웁니다
//그후 괄호직전의 오퍼레이션을 팝합니다
i++;
printf("출력값:");
for(j=0;j<=expcount;j++){
printf("%c",exptemp[j]);}
printf("\n\n\n");
}
else if (tk=='*' || tk=='/' || tk=='+' || tk=='-' || tk=='('){
while( checkPIS(peek(&stack)) >= checkPIE(tk)){
if(checkPIS(peek(&stack)) == checkPIE(tk)){
exptemp[expcount]=pop(&stack);
popcount++; expcount++;
}//같으면 pop, 스택이크면 tk가 exp로
else if (checkPIS(peek(&stack)) > checkPIE(tk)){
exptemp[expcount]=tk;
expcount++;
}
push(&stack,tk);//stack의 PIS가 작은 경우 토큰 PUSH
popcount--;
t++;
if (peek(&stack)==tk){
break;
}
}
push(&stack,tk);
popcount--;
t++; i++;
printf("출력값:");
for(j=0;j<=expcount;j++){
printf("%c",exptemp[j]);
}printf("\n\n\n");
}
else if (tk==NULL) {
while(t!=0){
exptemp[expcount]=pop(&stack);
popcount++; expcount++;
t--; cnt=t;
}
printf("출력값:");
for(j=0;j<=expcount;j++){
printf("%c",exptemp[j]);
}printf("\n\n\n");
i++;
}
else{
exptemp[expcount]=tk;
expcount++;
printf("출력값:");
for(j=0;j<=expcount;j++){
printf("%c",exptemp[j]);
}printf("\n\n\n");
i++;
}
/**************여기까지 postfix계산과정********************/
printf("후위표기변환된 식은 %s입니다.\n",exptemp);
system("pause");
return 0;
}
'소프트웨어 > C/C++' 카테고리의 다른 글
객체] public, protected, private (0) | 2013.08.11 |
---|---|
c/c++] 클래스 동적할당 (0) | 2013.08.10 |
c++] 동적할당실패시 예외처리 (0) | 2013.08.10 |
c/c++] malloc은 void*를 리턴 (0) | 2013.08.10 |
C/C++] 구조체의 크기 (0) | 2013.08.10 |
데이터 검색 (0) | 2012.04.01 |
순위구하기 알고리즘 (0) | 2012.04.01 |