已经用C语言的栈写出个位数的四则运算,但不知道怎么修改成支持小数和多位数甚至可以sin,log,绝对值等数学运算,就类似于科学计算器,只要求控制台界面简单的输入就好,求大神帮忙在我的基础上修改,谢谢了!
#include
#include
#define newp (inn )malloc(sizeof(inn)) //定义一个申请栈地址的宏
typedef struct stack
{
char data;//存入数据类型为字符
struct stack *next;//建立指针
}inn; //建立栈类型
int judge(char x) //比较优先级函数
{
if(x=='+'||x=='-') return 0;
else if(x==''||x=='/') return 1;
else if(x=='#'||x=='('||x==')') return -1;
}
int main()
{
int flag = 1;
while(flag)
{
printf("尾部不需要添加任何符号即可计算: ");
inn p,*top; //栈指针和栈顶指针
int number[50];//存入数字的数组
int i=0;
char c;
p = newp;//s开空间,newp为宏定义
p->data='#';//头指针第一个字符为#
p->next = NULL;//初始化头指针里的next指针
top = p;//top跟p一起,接着新开的p的next指向top,栈用链表顺序不一样
c = getchar();//之后是读取中缀表达式的部分,用字符一个一个的读
while(c!='\n')//直到读到回车结束
{
if(c>='0' && c<='9')//如果输入的是数字,存入数字数组(number)
{
i++;//加完后i=1
number[i] = c-48;//字符转数字存入数组
}
else if(c=='(')//如果是左括号,直接进栈
{
p = newp; //s开空间,newp为宏定义
p->data = c;//把左括号字符存入
p->next = top;//指针指向栈顶指针
top = p;//top指向p,到后面读从top往回读直到p->next = NULL
}
else if(c==')') //如果是右括号,匹配左括号,把两者之间的栈内符号全部弹出
{
while(top->data!='(')//首先判断左括号,然后从左括号开始到右括号所有字符弹出
{
p = top;//从左括号开始,用于计算完后p的地址释放空间
if(top->data=='+')
{
number[i-1]=number[i-1]+number[i];
i--;
}
else if(top->data=='-')
{
number[i-1]=number[i-1]-number[i];
i--;
}
else if(top->data=='')
{
number[i-1]=number[i-1]*number[i];
i--;
}
else if(top->data=='/')
{
number[i-1]=number[i-1]/number[i];
i--;
}
top = top->next;//遍历链表
free(p);//释放空间
}
p = top;//此时p用于指向空间便于下一步释放空间
top = top->next;//top++
free(p);
}
else //否则就是+-*/了
{
int a =judge(c),b = judge(top->data);//比较该符号和栈顶符号优先级
if(a>b) //如果大于直接压进去
{
p = newp;//开空间
p->data = c;
p->next = top;
top = p;
}
else //否则就把栈顶的符号一直弹出,直到弹到可以压进去(也就是说等于也不能压进去)
{
while(a<=b)
{
p = top;//从左括号开始,用于计算完后p的地址释放空间
if(top->data=='+')
{
number[i-1]=number[i-1]+number[i];
i--;
}
else if(top->data=='-')
{
number[i-1]=number[i-1]-number[i];
i--;
}
else if(top->data=='*')
{
number[i-1]=number[i-1]*number[i];
i--;
}
else if(top->data=='/')
{
number[i-1]=number[i-1]/number[i];
i--;
}
top = top->next;//遍历链表
free(p);//释放空间
b = judge(top->data);
}
p = newp;//开空间
p->data = c;//存入字符
p->next = top;
top = p;
}
}
c = getchar();//读取下一个字符
}
while(top->data!='#')//读完还没有结束,还要把栈内剩余的所有符号挨个弹出
{
p = top;
if(top->data=='+')
{
number[i-1] = number[i-1]+number[i];
i--;
}
else if(top->data=='-')
{
number[i-1] = number[i-1]-number[i];
i--;
}
else if(top->data=='*')
{
number[i-1] = number[i-1]*number[i];
i--;
}
else if(top->data=='/')
{
number[i-1]=number[i-1]/number[i];
i--;
}
top = top->next;
free(p);
}
printf("结果 = %d\n",number[i]);
printf("\n是否需要继续输入?输入任何个位数字继续 / 0则退出\n");
scanf("%d",&flag);
c = getchar();
}
return 0;
}