数据结构 栈(四则表达式)

#include "stdio.h"
#define MAXSIZE 20
#define max_size 30
typedef struct 
{
	int data[MAXSIZE];
	int top;
}NumberStack,*pNumberStack;//数字栈
typedef struct 
{
	char data[MAXSIZE];
	int top;
}SymbolStack,*pSymbolStack;//符号栈
void Init_Number(pNumberStack S); //初始化数字栈
void Init_Symbol(pSymbolStack S); //初始化符号栈
bool Push_Number(pNumberStack S,int val); //进栈
bool Push_Symbol(pSymbolStack S,char val);//进栈
bool Pop_Number(pNumberStack S,int *pVal);//出栈
bool Pop_Symbol(pSymbolStack S,char *pVal);//出栈
bool Get_Number(pNumberStack S,int *pVal);//得到栈顶元素
bool Get_Symbol(pSymbolStack S,int *pVal); //得到栈顶元素
bool is_number(char c);//当前字符是否为数字
bool is_symbol(char c);//当前字符是否为符号



int Priority(char c)
{
	if(c=='*'||c=='/'||c=='%')
	{
		return 2;
	}
	else {
		return 1;
	}
}


void Init_Number(pNumberStack S)
{
	S->top = -1;
}
void Init_Symbol(pSymbolStack S)
{
	S->top = -1;
}
bool Push_Number(pNumberStack S,int val)
{
	if(S->top == MAXSIZE-1)
	{
		return false;
	}
	else
	{
		S->data[++S->top] = val;
		return true;
	}
}
bool Push_Symbol(pSymbolStack S,char val)
{
	if(S->top == MAXSIZE-1)
	{
		return false;
	}
	else
	{
		S->data[++S->top] = val;
		return true;
	}
}
bool Pop_Number(pNumberStack S,int *pVal)
{
	if(S->top == -1)
	{
		return false;
	}
	else
	{
		*pVal = S->data[S->top--];
		return true;
	}
}
bool Pop_Symbol(pSymbolStack S,char *pVal)
{
	if(S->top == -1)
	{
		return false;
	}
	else
	{
		*pVal = S->data[S->top--];
		return true;
	}
}
bool Get_Number(pNumberStack S,int *pVal)
{
	if(S->top == -1)
	{
		return false;
	}
	else
	{
		*pVal = S->data[S->top];
		return true;
	}
}
bool Get_Symbol(pSymbolStack S,char *pVal)
{
	if(S->top == -1)
	{
		return false;
	}
	else
	{
		*pVal = S->data[S->top];
		return true;
	}
}


bool is_number(char c)
{
	if(c>='0'&&c<='9')
	{
		return true;
	}
	else
		return false;
}
bool is_symbol(char c)
{
	if(c<='0'||c>='9')
	{
		return true;
	}
	else
		return false;
}
void main()
{
	
	SymbolStack  symbolStack;
	
	Init_Symbol(&symbolStack);
	int i=0, j=0;
	char cval;//用来取得栈顶元素
	char s[max_size]="9+2*5-2+(3+2-2*2)*3+8/2-4/2+8";
	char s2[max_size];//保存后缀表达式


	/*
	*将中缀表达式转换为后缀表达式
	*/
	while(i<max_size-1)
	{
		if(is_number(s[i]))//是数字
		{
			s2[j++]=s[i];//保存数字
		}
		else//不是数字
		{
			if(symbolStack.top==-1)//栈空,
			{
				Push_Symbol(&symbolStack,s[i]); //直接进栈
			}
			else  //栈不空
			{
				if(s[i]!=')')  //当前字符不为 )
				{
					if(s[i]=='(')  //当前字符为 (   则直接进栈
					{
						Push_Symbol(&symbolStack,s[i]);
					}   
					else   //当前字符不为 (或 )
					{
						Get_Symbol(&symbolStack,&cval);//得到栈顶元素
					
						if(cval =='(')  //栈顶元素是  (  则直接进站
						{
							Push_Symbol(&symbolStack,s[i]);			
						}
						else
						{
							if(Priority(cval)<Priority(s[i]))  //进行优先级比较  当前元素大于栈顶元素直接进站
							{
								Push_Symbol(&symbolStack,s[i]);
						
							}else  //否则出栈
							{
								
								Pop_Symbol(&symbolStack,&cval);
								s2[j++]=cval;

								Get_Symbol(&symbolStack,&cval);//得到栈顶元素
								//注:出栈后还要判断当前栈顶是否和当前元素等级大,或者相同,则还要继续出栈。
								while(Priority(cval)>=Priority(s[i])&&symbolStack.top!=-1&&cval!='(')
								{
									Pop_Symbol(&symbolStack,&cval);
									s2[j++]=cval;
									Get_Symbol(&symbolStack,&cval);//得到栈顶元素
								}


								//栈内元素出完栈之后,当前元素进栈
								Push_Symbol(&symbolStack,s[i]);
							}
						}
					}
				}
				else  //s[i]是)则出栈
				{
					Get_Symbol(&symbolStack,&cval);
					while (cval !='(')//出栈一直到栈顶元素为(
					{

						Pop_Symbol(&symbolStack,&cval);
					//	printf("出栈元素:%c\n",cval);
						s2[j++]=cval;

						Get_Symbol(&symbolStack,&cval);
					}
					// 让栈顶元素(也出栈 ,但不保存
					Pop_Symbol(&symbolStack,&cval);
				}
			}
		}
		i++;
	}
	while(symbolStack.top!=-1)
	{
		Pop_Symbol(&symbolStack,&cval);
		s2[j]=cval;
		j++;
	}
	//打印后缀表达式
	printf("后缀表达式:(%s)\n",s2);
	
    
	/***
	对后缀表达式进行操作
	*****/
	//定义并初始化数字栈
	NumberStack  numberStack;
	Init_Number(&numberStack);
	int number1,number2;//用来保存出栈的元素
	int result;//保存出栈元素操作之后的值
    i=0;
	while(i<max_size-1)
	{
		if(is_number(s2[i]))
		{
			Push_Number(&numberStack,s2[i]-'0');//将字符转换成数字进栈
		}
		else
		{
			Pop_Number(&numberStack,&number2);
			Pop_Number(&numberStack,&number1);
			switch(s2[i])
			{
				case '+': result = number1+number2;break;
				case '-': result = number1-number2;break;
				case '*': result = number1*number2;break;
				case '/': result = number1/number2;break;
				case '%': result = number1%number2;break;

			}
			Push_Number(&numberStack,result);
		}
		i++;
	}
	Pop_Number(&numberStack,&result);
	printf("%s=%d\n",s,result);


}
/*
自己写的存在一些不足,欢迎拍砖
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值