用C语言和栈,输入任意带括号的中序表达式
(后序表达式的概念:又称后缀表达式,不含括号的表达式,他的运算符写在前面,操作数写在后面,也没有算术优先级问题,又称“逆波兰式”
优点:计算机从左到右扫描,不需要考虑算术优先级问题)
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define maxsize 100
struct Node{
int size;//数据容量
char *first;//仅作为空时的标志,计算位数
char *end;
};
typedef struct Node *stack;
void Change(stack str,char *arry);
int main()
{
stack str = (stack)malloc(sizeof(struct Node)); //堆栈初始化
str->size = maxsize;
str->end = (char *)malloc(sizeof(char)*str->size);
str->first = str->end;//同一位置
char *arry;
arry = (char*)malloc(sizeof(char)*str->size);
scanf("%s",arry);
Change(str,arry);
return 0;
}
void Change(stack str,char *arry)
{
int i = 0;
char ch;
while( arry[i] != '\0')
{
while( isdigit(arry[i]) ) //输出数字
{
printf("%c",arry[i++]);
if( !isdigit(arry[i]) )//下一个字母不是数字,则退出
{
printf(" ");
}
}
if(arry[i] == '+' || arry[i] == '-')
{
if( str->end - str->first == 0)//堆栈为空的时候
{
*str->end++ = arry[i];
}
else//否则
{
do{
if( *--str->end == '(' )//达到跳出的条件
{
*str->end++ = '(';
break;
}
else
printf("%c ",*str->end);
}while( str->end - str->first != 0 );
*str->end++ = arry[i];
}
}
else if(arry[i] == ')')
{
ch = *--str->end;
while(ch != '(')
{
printf("%c ",ch);
ch = *--str->end;
}
}
else if(arry[i] == '*'|| arry[i] == '/' || arry[i] == '(')
{
*str->end++ = arry[i];
}
else
{
if(arry[i] == '\0')
break;
printf("\n输入格式错误!\n");
return ;
}
i ++;
}
while(str->end - str->first != 0)
{
printf("%c ",*--str->end);
}
return ;
}