c语言数据结构——四则运算 简单

As we all know, c语言数据结构中的四则运算一直是一个常点,比较重要,是初学者一个必敲的代码,下面我罗列了四种数据结构四则运算,先从书(严老师)上到扩展;
严老师的数据结构上的四则运算思路是:

初始化OPTR与OPND栈(分别存储运算符号,数字),将表达式起始符 # 压入OPTR
当表达式没有扫描完毕或OPTR的栈顶元素不为#时,循环
若ch不是运算符,压入OPND,读入下一个字符;
若ch是,根据循环条件:OPTR的栈顶元素与优先级进行比较,做不同的处理
若是小于,ch压入OPTR,下一个
若是大于,弹出OPTR栈顶运算符,弹出OPND两个数,进行相应运算,压入OPND
若是对于,则OPTR栈顶元素是“(”且ch是 “)”,弹出OPTR栈顶“(”,即括号匹配成功,读入下一个

OPND栈顶元素即为表达式求值结果,返回此元素

其代码是:

char EvaluateExpression()
{
InitStack(OPTR);
InitStack(OPND);
push(OPTR,’#’);
cin>>ch;
while(ch!=’#’||GetTop(OPTR)!=’#’)
{
if(!In(ch))
{
push(OPND,ch);
cin>>ch;
}
else
switch(Precede(GetTop(OPTR),ch))
{
case’<’:
push(OPTR,ch);
cin>>ch;
break;
case’>’:
Pop(OPTR,theta);
Pop(OPND,a);Pop(OPND,b);
Push(OPND,Operate(a,theta,b));
break;
case’=’:
Pop(OPTR,x);
cin>>ch;
break;
}
}
return GetTop(OPND);
}

我们扩展一下就得到了一个能运行四则运算的正常代码:

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
char EvaluateExpression()
 {
   
   
 	InitStack(OPTR);
 	InitStack(OPND);
 	push(OPTR,'#');
 	cin>>ch;
 	while(ch!='#'||GetTop(OPTR)!='#')
 	{
   
   
 		if(!In(ch))
 		{
   
   
 			push(OPND,ch);
 			cin>>ch;
		}
		else
		  switch(Precede(GetTop(OPTR),ch))
		  {
   
   
		  	case'<':
		  		push(OPTR,ch);
		  		cin>>ch;
		  		break;
		  	case'>':
		  		Pop(OPTR,theta);
		  		Pop(OPND,a);Pop(OPND,b);
		  		Push(OPND,Operate(a,theta,b));
		  		break;
		  	case'=':
		  		Pop(OPTR,x);
		  		cin>>ch;
		  		break;
		  }
	 }
    return GetTop(OPND); 	
  }
 int main()
 {
   
   
 char a[];
 gets(a);
printf("%d",EvaluateExpression(a));
return 0;
} 
>

其中函数In是判定读入的字符ch是否为运算符,Precede是判定运算符栈的栈顶元素与读入的运算符之间优先关系的函数,Operate为进行一元运算的函数

我们从书上的思路再延申再扩展一下,就得到了下面的代码:

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
int Preemption(char a,char b)                           //符号优先级比较,a为当前读入,b为栈顶元素 
{
   
   
 int c;                                              //c反馈指令信息 0.结束 1.弹出 2.进栈 3.删除当前元素及栈顶元素 4.报错 
 switch(a)
 {
   
   
  case '#':if(b=='#') c=0;
           else c=1;break;
  case '+':if(b=='#'||b=='(') c=2;
           else c=1;break;
  case '-':if(b=='#'||b=='(') c=2;
           else c=1;break;
  case '*':if(b=='*'||b=='/') c=1;
           else c=2;break;
  case '/':if(b=='*'||b=='/') c=1;
           else c=2;break;
  case '(':c=2;break;
  case ')':if(b=='(') c=3;
     else c=1;break;
  default :c=4;break; 
 }
 return c;
} 
int main()
{
   
   
 char str[50]={
   
   "\0"};
 char *p=str;
 int *p3,*p4,a=0,b=0;
 char *p1,*p2;
 char stack1[20];                      //符号栈 栈顶指针p2,栈底指针p1 
 int stack2[20];                       //数字栈 栈顶指针p4,栈底指针p3 
 p1=p2=stack1;
 p3=p4=stack2;
 *p2++='#';
 
 gets<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四夕兴言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值