69,373
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 100
typedef char ElemType;
typedef struct StackList
{
ElemType data[MAX_SIZE];
int top;
}SeqStack;
//³初始化栈
SeqStack * InitStack()
{
SeqStack *p;
if((p = (SeqStack*)malloc(sizeof(SeqStack)))==NULL)
{
printf("³õʼ»¯Õ»Ê§°Ü£¬Ã»ÓÐ×ã¹»¿Õ¼ä\n");
return NULL;
}
p->top=-1;
return p;
};
//判空
int IsEmptyStack(SeqStack *s)
{
return s->top == -1 ? 1 :0;
} ;
//入栈
SeqStack* Push(SeqStack* s,ElemType data)
{
if(s->top==MAX_SIZE-1)
{
printf("Õ»Âú£¡\n");
}
else
{
s->top++;
s->data[s->top]=data;
return s;
}
}
//出战
ElemType Pop(SeqStack* s)
{
if(IsEmptyStack(s))
{
printf("Õ»¿Õ\n");
exit(0);
}
else
{
ElemType temp = s->data[s->top];
s->top--;
return temp;
}
}
//获取栈顶数据
ElemType GetTop(SeqStack *s)
{
if(IsEmptyStack(s))
{
printf("Õ»¿Õ\n");
exit(0);
}
else
{
return s->data[s->top];
}
}
/************************************************************/
//是否是数字
int IsValue(char ch)
{
return ch>='0' && ch<='9' ? 1 :0;
};
//是否是操作符
int isOperate(char ch)
{
return ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')' ? 1 :0;
};
//是否是合法字符
int isAvail(char ch)
{
return IsValue(ch)||isOperate(ch) ? 1 : 0;
};
//获取矩阵坐标
int getNum(char ch)
{
int i=0;
char oper[7]={'+','-','*','/','(',')'};
for(i=0;i<7;i++)
{
if(ch==oper[i])
{
return i;
}
}
}
//判断操作符优先级operF为栈顶,operL为当前操作符
char GetOper(char operF,char operL)
{
//+ - * / ( );
char Priority[6][6]={
{'<','<','<','<','>','>'},
{'<','<','<','<','>','>'},
{'>','>','<','<','>','>'},
{'>','>','<','<','>','>'},
{'>','>','>','>','>','='},
{'<','<','<','<','=','0'}
};
char row = getNum(operF);
char col = getNum(operL);
return Priority[row][col];
};
//如果输入的数字是2位树以上返回该数字的字符串
char* ConvertToNum(char**cElement)
{
char *first ,*temp ;
first=temp = (char*)malloc(sizeof(char)*10);
while(isAvail(**cElement)&&(!isOperate(**cElement))&&**cElement!='\0')//Èç¹ûÊÇÓÐЧ×Ö·û
{
*temp++=*(*cElement)++;
}
*temp ='\0';
// printf("ŶӴ%s",first);
return first;
// return atol(temp);
}
//逆波兰是转换
char * PutsNBL(char* element)
{
char *numStr[100],*ch;
int i=0;
SeqStack *stack =InitStack();
while(*element!='\0')
{
if(IsValue(*element))
{
ch= ConvertToNum(&element);
numStr[i++]=ch;
// printf("Êî´ÙÊÇ£º%s---£º",numStr[i-1]);
}
else
{
if(IsEmptyStack(stack))
{
Push(stack,*element++);
}
else
{
char op = GetOper(*element,GetTop(stack));
switch(op)
{
case '>':
Push(stack,*element);
element++;
break;
case '<':
if(!IsEmptyStack(stack))
{
char *tems = (char*)malloc(sizeof(char)*2);
*tems= Pop(stack);
*(tems+1)='\0';
numStr[i++]=tems;
}
break;
case '=':
Pop(stack);
element++;
break;
}
}
}
}
while(!IsEmptyStack(stack))
{
char *tem = (char*)malloc(sizeof(char)*2);
*tem= Pop(stack);
*(tem+1)='\0';
numStr[i++]=tem;
}
//输出逆波兰式
int k=0;
while(numStr[k])
{
printf("Ä沨À¼£º%s\n",numStr[k++]);
};
return NULL;
}
/**********************************************/
int main(int argc, char *argv[])
{
/*char ch;
SeqStack *s =InitStack();
while((ch=getchar())!='\n')
{
Push(s,ch);
}
Push(s,'#fdfds#');
while(!IsEmptyStack(s))
{
char c = Pop(s);
printf("%c",c);
}
*/
char mathStr[100];
gets(mathStr);
PutsNBL(mathStr);
system("PAUSE");
return 0;
}