#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXzhansize 30
char stack[MAXzhansize];//
char deleted(int *top);
void add(int *top,char item);
//
逆波兰数计算
#define element int
#define ni_MAXzhansize 20
/+ - * / % out 数字
typedef enum{jia,jian,cheng,chu,yu,eos,shuzi}prece;
int ni_stack[ni_MAXzhansize];
void nisuanadd(int *top,element item);
element nisuandeleted(int *p);
int eval();
prece gettoken(char*symbol,int *n);
char c[30];结果字符
void main()
{
int a[128];
a['+']=1;///预备优先级
a['-']=1;
a['*']=2;
a['/']=2;
a['%']=2;
a['(']=0;
a[')']=0;
a[',']=-1;
int top=-1,j=0;//top始终是指向栈顶元素的
char b[30];/原始字符
gets(b);//(2+3*4+5)*(2+3)
add(&top,',');// 最低优先级a[',']=-1;
for(int i=0;b[i]!='\0';++i)
{
if(!isdigit( b[i]) )///不是数字符号时,若是数字就直接加入数组c中
{
if(b[i] == '(' )//前两个if语句 处理特殊情况 一对括号
{
add( &top, b[i] );//直接加到栈里'('
continue;
}
if(b[i] == ')' )//处理一对括号
{
while( stack[top] != '(' )//输出符号
{
c[j++]=deleted(&top);
printf("%c",c[j-1]);
}
deleted(&top);//除掉一个'('
continue;
}
if(a[ b[i] ] > a[ stack[top] ])
当前的符号优先级大于栈顶的符号是放入,,否则弹出栈顶..........
{
add( &top, b[i] );
continue;
}
else
{
while(a[ b[i] ] <= a[ stack[top] ])/输出符号直到大于栈顶符号的优先级
{
c[j++]=deleted(&top);
printf("%c",c[j-1]);
}
add( &top, b[i] );//把当前的符号加进去
continue;
}
}
else是数字符号时
{
c[j++]=b[i];
printf("%c",c[j-1]);
}
}
while(top !=0 )/栈里剩余的符号输出
{
c[j++]=deleted(&top);
printf("%c",c[j-1]);
}
c[j++]=' ';//这个空位用于终止
c[j++]='\0';补上空字符
printf(" ");
puts(c);
printf("\n%d",eval());
}
void add(int *top,char item)
{
if(*top>=MAXzhansize)
{
printf("jj\n");
exit(1);
}
stack[++*top]=item;
}
char deleted(int *top)
{
if(*top==-1)
{
printf("kkkkkkkkkkkkkk\n");
exit(1);
}
return stack[(*top)--];
}
/逆波兰数计算
int eval()
{
prece token;//符号或数字
char symbol;
int shu1,shu2;
int n=0;
int top=-1;
token=gettoken(&symbol,&n);
while(token!=eos)//不到尾部
{
if(token==shuzi)
nisuanadd(&top,symbol-'0');//是数字就加进去
else
{///否则调用两个数据与符号操作后,再加进去
shu2=nisuandeleted(&top);
shu1=nisuandeleted(&top);
switch(token)
{
case jia:nisuanadd(&top,shu1+shu2);break;
case jian:nisuanadd(&top,shu1-shu2);break;
case cheng:nisuanadd(&top,shu1*shu2);break;
case chu:nisuanadd(&top,shu1/shu2);break;
case yu:nisuanadd(&top,shu1%shu2);break;
}
}
token=gettoken(&symbol,&n);//下一个
}
return nisuandeleted(&top);
}
prece gettoken(char*symbol,int *n)
{
*symbol=c[(*n)++];//下一个字符
switch(*symbol)
{
case'+':return jia;
case'-':return jian;
case'*':return cheng;
case'/':return chu;
case'%':return yu;
case' ':return eos;
default:return shuzi;
}
}
void nisuanadd(int *top,int item)
{
if(*top>=MAXzhansize)
{
printf("jjjjjj\n");
exit(1);
}
ni_stack[++*top]=item;
}
int nisuandeleted(int *top)
{
if(*top==-1)
{
printf("kkkkkkk\n");
exit(1);
}
return ni_stack[(*top)--];
}
//
算术表达式
最新推荐文章于 2024-01-16 11:15:33 发布