话不多说,直接上代码,已在DEV C++等编译器上实现
我知道你会点赞的!!!
运行部分,直接输入表达式即可得出结果
#include<stdio.h>
#include<stdlib.h>
char opt[128];
typedef struct Stacknode1{ //定义链栈结点和头指针
int num;
struct Stacknode*next;
}stacknode1,*linkstack_numnode;
typedef struct{
linkstack_numnode top;
int count;
}linkstacknum;
typedef struct Stacknode2{
char opt;
struct Stacknode2 *next;
}stacknode2,*linkstack_charnode;
typedef struct{
linkstack_charnode top;
int count;
}linkstackchar;
int push1(linkstacknum *p,int number) { //入栈和出栈操作
linkstack_numnode s=(linkstack_numnode)malloc(sizeof(linkstacknum));
s->num=number;
s->next=p->top;
p->top=s;
p->count++;
return 1;
}
int pop1(linkstacknum *p,int *number){
linkstack_numnode p1;
if(p->top==0)
return 0;
*number=p->top->num;
p1=p->top;
p->top=p->top->next;
p->count--;
return 1;
}
int push2(linkstackchar *q,char c){
linkstack_charnode s=(linkstack_charnode)malloc(sizeof(linkstackchar));
s->opt=c;
s->next=q->top;
q->top=s;
q->count++;
return 1;
}
int pop2(linkstackchar*q,char *c){
linkstack_charnode q1;
if(q->top==0)
return 0;
*c=q->top->opt;
q1=q->top;
q->top=q->top->next;
q->count--;
}
int priority(char ch)
{
switch(ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}
int cal(linkstacknum* n,linkstackchar*c){//相关计算操作,中缀表达式和后缀表达式的转换
int i=0;
int tempe=0,number1,number2;
char option;
while(opt[i]!='\0'||c->top!=0){ //将表达式中的 数字输入
if(opt[i]>='0'&&opt[i]<='9'){
tempe=tempe*10+opt[i]-'0';
i++;
if(opt[i]<'0'||opt[i]>'9'){
push1(n,tempe);
tempe=0;
}
}
else{//符号优先级的判断,有符号依此入栈决定,如果入栈小于栈顶,则对数据栈顶两元素进行运算并将结果存入数据栈顶
if(c->top==0||(c->top->opt=='('&&opt[i]!=')')||priority(opt[i])>priority(c->top->opt)){
push2(c,opt[i]);
i++;
continue;
}
if(c->top->opt=='('&&opt[i]==')'){
char tem;
pop2(c,&tem);
i++;
continue;
}
if((c->top!=0&&opt[i]=='\0')||opt[i]==')'&&c->top->opt!='('||priority(opt[i])<=priority(c->top->opt)){
pop2(c,&option);
switch(option){
case'+':
{
pop1(n,&number1);
pop1(n,&number2);
push1(n,(number1+number2));
break;
}
case'-':{
pop1(n,&number1);
pop1(n,&number2);
push1(n,(number2-number1));
break;
}
case'*':{
pop1(n,&number1);
pop1(n,&number2);
push1(n,(number1*number2));
break;
}
case'/':{
pop1(n,&number1);
pop1(n,&number2);
push1(n,(number2/number1));
break;
}
}
}
}
}
tempe=n->top->num;
return tempe;
}
int main()
{
linkstacknum *n=(linkstacknum*)malloc(sizeof(linkstacknum));
linkstackchar *c=(linkstackchar*)malloc(sizeof(linkstackchar));
c->top=0;
c->count=0;
n->top=0;
n->count=0;
printf("请输入表达式\n");
scanf("%s",opt);
printf("结果为:%d",cal(n,c));
return 0;
}