《数据结构实验》第三章实验:多位整数带括号的简单四则运算器

四则运算器:实现多位整数的带括号的四则运算  

#include <stdio.h>
#include <stdlib.h>
 
#define TRUE 1
#define FALSE 0
#define Stack_Size 50

typedef char StackElementType;
typedef struct
{
	StackElementType elem[Stack_Size];
	int top;
}SeqStack;
typedef struct
{
	int elem[Stack_Size];
	int top;
}SeqStack_num;
//初始化栈
void InitStack(SeqStack *S)
{
	S->top=-1;
} 

void InitStack_num(SeqStack_num *S)
{
	S->top=-1;
} 
//进栈
int Push(SeqStack *S,StackElementType x)
{
	if(S->top==Stack_Size-1)
	 return(FALSE);
	S->top++;
	S->elem[S->top]=x;
	return(TRUE);
}
int Push_num(SeqStack_num *S,int x)
{
	if(S->top==Stack_Size-1)
	 return(FALSE);
	S->top++;
	S->elem[S->top]=x;
	return(TRUE);
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
	if(S->top==-1)
	 return(FALSE);
	else
	{
		*x=S->elem[S->top];
		S->top--;
		return(TRUE); 
	}
} 
int Pop_num(SeqStack_num *S,int *x)
{
	if(S->top==-1)
	 return(FALSE);
	else
	{
		*x=S->elem[S->top];
		S->top--;
		return(TRUE); 
	}
} 
//读栈顶元素
StackElementType GetTop(SeqStack *S)
{
	StackElementType x;
	if(S->top==-1)
	 return(FALSE);
	else
	{
		x=S->elem[S->top];
		return(x);
	}
} 
int GetTop_num(SeqStack_num *S)
{
	int x;
	if(S->top==-1)
	 return(FALSE);
	else
	{
		x=S->elem[S->top];
		return(x);
	}
} 

//优先级比较函数

/*StackElementType Compare(StackElementType ch,StackElementType ch_temp)
{
	char compare[7][7]={
		{'<','<','<','<','<','0','>'},
		{'<','<','<','<','<','0','>'},
		{'>','>','<','<','<','0','>'},
		{'>','>','<','<','<','0','>'},
		{'>','>','>','>','>','0','>'},
		{'<','<','<','<','=','0','0'},
		{'<','<','<','<','<','0','0'}
	
	};
	int index,index_temp;
	switch(ch)
	{
		case '+':index=0;break;
		case '-':index=1;break;
		case '*':index=2;break;
		case '/':index=3;break;
		case '(':index=4;break;
		case ')':index=5;break;
		case '#':index=6;break;
	}
	switch(ch_temp)
	{
		case '+':index_temp=0;break;
		case '-':index_temp=1;break;
		case '*':index_temp=2;break;
		case '/':index_temp=3;break;
		case '(':index_temp=4;break;
		case ')':index_temp=5;break;
		case '#':index_temp=6;break;
	}
	return(compare[index][index_temp]);
}
*/
StackElementType Compare(StackElementType m,StackElementType n){
	switch(m){
	case'+':switch(n){
			case'+':return '=';
			case'-':return '=';
			case'*':return '<';
			case'/':return '<';
			case'#':return '>';
			case'(':return '>';
			}
	case'-':switch(n){
			case'+':return '=';
			case'-':return '=';
			case'*':return '<';
			case'/':return '<';
			case'#':return '>';
			case'(':return '>';
			}
	case'*':switch(n){
			case'+':return '>';
			case'-':return '>';
			case'*':return '=';
			case'/':return '=';
			case'#':return '>';
			case'(':return '>';
			}
	case'/':switch(n){
			case'+':return '>';
			case'-':return '>';
			case'*':return '=';
			case'/':return '=';
			case'#':return '>';
			case'(':return '>';
			}
	case'(':switch(n){
			case'+':return '>';
			case'-':return '>';
			case'*':return '>';
			case'/':return '>';
			case'#':return '>';
			case'(':return '>';
			}
	default:return '<';
	}
}


//主函数
int main()
{
	SeqStack_num OVS;
	SeqStack OPTR;
	InitStack_num(&OVS);
	InitStack(&OPTR);//初始化
	char ch,ch_temp,op;
	int num,v,temp,x;
	Push(&OPTR,'#');
	printf("Please input an expression(Ending with #):");
	ch=getchar();
	while(ch!='#'||GetTop(&OPTR)!='#')
	{
		if(ch>='0'&&ch<='9')//不是操作符,是操作数 
		{
			temp=ch-'0';//先把当前操作数从字符转换成数字 
			ch=getchar();
			while(ch>='0'&&ch<='9')
			{
				temp=temp*10+ch-'0';
				ch=getchar();
			}
			Push_num(&OVS,temp);
		}
		else
		{
		 switch(Compare(ch,GetTop(&OPTR)))
		 {
		 	case '>':Push(&OPTR,ch);ch=getchar();break;
		 	case '=':
		 	case '<':
		 		num=GetTop_num(&OVS);
				Pop_num(&OVS,&x);
				switch(GetTop(&OPTR)){
					case'+':num=GetTop_num(&OVS)+num;break;
					case'-':num=GetTop_num(&OVS)-num;break;
					case'*':num=GetTop_num(&OVS)*num;break;
					case'/':num=GetTop_num(&OVS)/num;break;
				}
				Pop(&OPTR,&op);
				Pop_num(&OVS,&x);
				Push_num(&OVS,num);
				if(ch==')'){
					Pop(&OPTR,&op);
					ch=getchar();
				}
		 }
		}
		v=GetTop_num(&OVS);

		 
		
	}
	printf("the result is %d",v);
	
	 
} 

 下面是两个失败的例子

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define Stack_Size 50

typedef char StackElementType; //运算符 
typedef double StackElementType_num; //运算数 
typedef struct
{
	StackElementType elem[Stack_Size];
	int top;
}SeqStack; //运算符栈 
typedef struct
{
	StackElementType_num elem[Stack_Size];
	int top;
}SeqStack_num; //运算数栈 

StackElementType_num ExpEvaluation();

void InitStack(SeqStack *S);
int Push(SeqStack *S,StackElementType x);
int Push_num(SeqStack *S,StackElementType_num x);

int Pop(SeqStack *S,StackElementType *x);
int Pop_num(SeqStack *S,StackElementType_num *x);
int GetTop(SeqStack *S,StackElementType *x);
int GetTop_num(SeqStack *S,StackElementType_num *x);
StackElementType Compare(StackElementType ch1,StackElementType ch2);
StackElementType Execute(StackElementType_num a,StackElementType op,StackElementType_num b);

int main()
{
    printf("%lf",ExpEvaluation()); 
	return(0);
}
StackElementType_num ExpEvaluation()
{
	char exp[100];//用字符数组将运算表达式存起来 
	int i=0,count=0;
	printf("Please input an expression (Ending with #:)");
	exp[i]=getchar();
	while(exp[i]!='#')
	{
		i++;count++; 
		exp[i]=getchar();
	}
	SeqStack OPTR;
	SeqStack_num OVS;
	StackElementType ch,op,x;
	StackElementType_num a,b,v;
	InitStack(&OPTR);
	InitStack(&OVS);
	Push(&OPTR,'#');
	for(i=0;i<count;i++)
	{
		ch=exp[i];
		while(ch!='#'||GetTop(&OPTR,&x)!='#')
	    {
		  if(ch>='0'&&ch<='9')//不是操作符,是操作数,进OVS栈 
		  {
			int temp;
			temp=ch-'0';//先把当前操作数从字符变为数字 
			i++;
			ch=exp[i];
			while(ch>='0'&&ch<='9')//继续判断下一位是否为操作数
			{
				temp=temp*10+ch-'0';
				i++;
				ch=exp[i];
			} 
			Push_num(&OVS,temp);//压栈 
			
		  }
		  else
		  switch(Compare(ch,GetTop(&OPTR,&x)))
		  {
			case '>':Push(&OPTR,ch);
			  i++;ch=exp[i];
			case '=':Pop(&OPTR,&op);i++;ch=exp[i];break;//脱括号 
			case '<':Pop(&OPTR,&op);//形成运算 
		    Pop_num(&OVS,&b);
		    Pop_num(&OVS,&a);
		    v=Execute(a,op,b);
		    Push_num(&OVS,v);
		    break; 
		  }
	    }
	}
	
	v=GetTop_num(&OVS,&x);
	return(v);
} 

//初始化
void InitStack(SeqStack *S)
{
	/*构造一个空栈S*/
	S->top=-1; 
} 
//进栈
int Push(SeqStack *S,StackElementType x)
{
	if(S->top==Stack_Size-1)
	 return(FALSE);
	S->top++;
	S->elem[S->top]=x;
	return(TRUE);
} 
int Push_num(SeqStack *S,StackElementType_num x)
{
	if(S->top==Stack_Size-1)
	 return(FALSE);
	S->top++;
	S->elem[S->top]=x;
	return(TRUE);
} 

//出栈
int Pop(SeqStack *S,StackElementType *x)
{
	if(S->top==-1)
	 return(FALSE);
	*x=S->elem[S->top];
	S->top--;
	return(TRUE);
} 
int Pop_num(SeqStack *S,StackElementType_num *x)
{
	if(S->top==-1)
	 return(FALSE);
	*x=S->elem[S->top];
	S->top--;
	return(TRUE);
} 

//读栈顶
int GetTop(SeqStack *S,StackElementType *x)
{
	if(S->top==-1)
	 return(FALSE);
	else
	{
		*x=S->elem[S->top];
		return(TRUE);
	}
} 

int GetTop_num(SeqStack *S,StackElementType_num *x)
{
	if(S->top==-1)
	 return(FALSE);
	else
	{
		*x=S->elem[S->top];
		return(TRUE);
	}
} 


//比较优先级,返回'>','<','=' 
StackElementType Compare(StackElementType ch1,StackElementType ch2)
//ch1为还未进栈的运算符,ch2为当前运算符栈顶元素 
{
	//'('未入栈时,优先级最高,入栈后,优先级最低
	int m,n; 
	switch(ch1)
	{
		case '(':m=6;break;
		case '*':
		case '/':m=5;break;
		case '+':
		case '-':m=4;break;
		case ')':m=3;break;
		
	}
	switch(ch2)
	{
		case '*':
		case '/':n=6;break;
		case '+':
		case '-':n=5;break;
		case ')':n=4;break;
		case '(':n=3;break;
		
	}
	if(ch1>ch2)
	 return('>');
	 else if(ch1=ch2)
	  return('=');
	  else
	   return('<');
}
StackElementType_num Execute(StackElementType_num a,StackElementType op,StackElementType_num b)
{
	StackElementType_num v;
	switch(op)
	{
		case '+':v=a+b;break;
		case '-':v=a-b;break;
		case '*':v=a*b;break;
		case '/':v=a/b;break;
	}
	return(v);
}

 

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define Stack_Size 50

typedef char StackElementType; 
typedef struct
{
	StackElementType elem[Stack_Size];
	int Top;
}SeqStack; 

void InitStack(SeqStack *S);
int Push(SeqStack *S,StackElementType x);
int Pop(SeqStack *S,StackElementType *x);
int GetTop(SeqStack *S,StackElementType *x);
StackElementType Compare(StackElementType ch1,StackElementType ch2);
StackElementType Execute(StackElementType a,StackElementType op,StackElementType b);

int main()
{
    printf("%c",ExpEvaluation()); 
	return(0);
}
StackElementType ExpEvaluation()
{
	SeqStack OPTR,OVS;
	StackElementType n;
	StackElementType a,b,ch,op,x,v;
	InitStack(&OPTR);
	InitStack(&OVS);
	Push(&OPTR,'#');
	printf("Please input an expression(Ending with #):");
	ch=getchar();//为方便,所以数字也以字符形式来存储 
	while(ch!='#'||GetTop(&OPTR,&x)!='#')
	{
		if(ch>='0'&&ch<='9')//不是操作符,是操作数,进OVS栈 
		{
			int temp;
			temp=ch-'0';//先把当前操作数从字符变为数字 
			ch=getchar();
			while(ch>='0'&&ch<='9')//继续判断下一位是否为操作数
			{
				temp=temp*10+ch-'0';
				ch=getchar();
			} 
			Push(&OVS,temp);
			
		}
		else
		switch(Compare(ch,GetTop(&OPTR,&x)))
		{
			case '>':Push(&OPTR,ch);
			  scanf("%d",&ch);
			case '=':Pop(&OPTR,&op);ch=getchar();break;//脱括号 
			case '<':Pop(&OPTR,&op);//形成运算 
		    Pop(&OVS,&b);
		    Pop(&OVS,&a);
		    v=Execute(a,op,b);
		    //此处需要将v转换为字符型并且入站 
		    Push(&OVS,v);
		    break; 
		}
	}
	v=GetTop(&OVS,&x);
	return(v);
} 

//初始化
void InitStack(SeqStack *S)
{
	/*构造一个空栈S*/
	S->top=-1; 
} 
//进栈
int Push(SeqStack *S,StackElementType x)
{
	if(S->top==Stack_Size-1)
	 return(FALSE);
	S->top++;
	S->elem[S->top]=x;
	return(TRUE);
} 
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
	if(S->top==-1)
	 return(FALSE);
	*x=S->elem[S->top];
	S->top--;
	return(TRUE);
} 
//读栈顶
int GetTop(SeqStack *S,StackElementType *x)
{
	if(S->top==-1)
	 return(FALSE);
	else
	{
		*x=S->elem[S->top];
		return(TRUE);
	}
} 


//比较优先级,返回'>','<','=' 
StackElementType Compare(StackElementType ch1,StackElementType ch2)
//ch1为还未进栈的运算符,ch2为当前运算符栈顶元素 
{
	//'('未入栈时,优先级最高,入栈后,优先级最低 
	switch(ch1)
	{
		case '(':ch1=6;break;
		case '*':
		case '/':ch1=5;break;
		case '+':
		case '-':ch1=4;break;
		case ')':ch1=3;break;
	}
	switch(ch2)
	{
		case '*':
		case '/':ch2=5;break;
		case '+':
		case '-':ch2=4;break;
		case ')':ch2=3;break;
		case '(':ch2=2;break;
	}
	if(ch1>ch2)
	 return('>');
	 else if(ch1=ch2)
	  return('=');
	  else
	   return('<');
}
StackElementType Execute(StackElementType a,StackElementType op,StackElementType b)
{
	double v;
	switch(op)
	{
		case '+':v=(double)a+(double)b;break;
		case '-':v=(double)a-(double)b;break;
		case '*':v=(double)a*(double)b;break;
		case '/':v=(double)a/(double)b;break;
	}
	return((StackElementType)v);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值