数据结构 利用链栈实现计算器

话不多说,直接上代码,已在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;
	
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值