
计算器带码3
#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define N 100 //定义接收字符串大小
typedef struct StackNode
{
int num_ch; //数字和符号都用int存储
struct StackNode *next;
} StackNode;
//创建一个链栈 注意我的栈最后一个元素无意义但必须存在 因为方便在表达式末尾进行操作
StackNode *CreatStackNode()
{
StackNode *q=(StackNode *)malloc(sizeof(StackNode));
if(q==NULL)return NULL;
q->num_ch =0;
q->next=NULL;
return q;
}
//直接给最后一个元素赋值 并新建一个无意义的结点作为最后元素
int push(StackNode *p,int num)
{
while(p->next!=NULL)
{
p=p->next;
}
p->num_ch=num;
StackNode *q=(StackNode *)malloc(sizeof(StackNode));
q->num_ch =0;
q->next=NULL;
p->next=q;
return 0;
}
// 最后一个无意义的直接free // 倒数第二个next置空,返回倒数第二的值
int Pop(StackNode *p)
{
int tmp;
if(p->next==NULL) return -1;//只有头,无值时无法Pop
while(p->next->next!=NULL)
{
p=p->next;
}
tmp=p->num_ch;
free(p->next);
p->num_ch = 0;
p->next = NULL;
return tmp;
}//获取栈顶元素
int GetTop(StackNode *p)
{
while(p->next->next!=NULL)
{
p=p->next;
}
return p->num_ch;
}
//判栈空 如果只剩一个结点(这是个无意义的) 那么就为空
int Empty(StackNode *p)
{
if(p->next==NULL) return 1;
return 0;
}
//显示栈的所有元素
void DispStack(StackNode *p)
{
if(p->next==NULL) return;//只有头,无值时无法Pop
while(p->next!=NULL)
{
printf("%d,",p->num_ch);
p=p->next;
}
putchar(10);
}
//计算int变量的长度 例如1234长度为4
int sum_int(int in)
{
int len=0;
while(in!=0)
{
len++;
in/=10;
}
return len;
}
// 符号优先级判断 返回: 1(opt1>opt2) -1(opt1<opt2) 0(opt1=opt2) 注意符号的ASSIC码:43(+) 45(-) 42(*) 47(/)
int opt_max(int opt1,int opt2)
{
if(42==opt1||47==opt1)
{
if(43==opt2||45==opt2)
{
return 1;
}
return 0;
}
else
{
if(42==opt2||47==opt2)
{
return -1;
}
return 0;
}
}
//计算a和b在mode符号的运算结果
int cal(int a,int b,int mode)
{
int re=-1;
switch(mode)
{
case 43:
re=a+b;
break;
case 45:
re=a-b;
break;
case 42:
re=a*b;
break;
case 47:
re=a/b;
break;
default:
break;
}
return re;
}
//计算表达式的值
int cal(char *str)
{
int num1,num2,opt1,opt2;
StackNode *num,*opt;
num=CreatStackNode(); //创建数字栈
opt=CreatStackNode(); //创建符号栈
while(1)
{
if('