数据结构算法:中缀表达式转化为后缀表达式

题目:中缀表达式转化为后缀表达式算法及其后缀表达式计算算法的实现。

内容:掌握栈的存储结构的C语言描述。

     掌握中缀表达式和后缀表达式的存储结构。

     掌握后缀表达式算法的实现。

程序代码:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define MAX 60
#define DEMAX 15
#define NULL 0
char string1[MAX];
char string2[MAX];
int j=0;
struct node 
{
	char data;
	int num;
	struct node *next;
};
struct node *Initialization()//初始化栈链,链栈不带头结点
{
	struct node *top;
	top=(struct node *)malloc(sizeof(struct node));
	top->data='@';
	top->num=0;
	top->next=NULL;
	return top;
}
struct node *assort(struct node *s)//输入字符串
{
	struct node *p,*top;
	int i;
	top=s;
	int m;
	char a;
	gets(string1);
	m=strlen(string1);
    for(i=0;i<=m;i++)
	{
		a=string1[i];
		if('0'<=string1[i]&&string1[i]<='9')
		{
			string2[j]=string1[i];j++;
		}
		else
		{
			switch(a)
			{
			 case '(':{
						 p=(struct node *)malloc(sizeof(struct node));
						 p->data=a;p->next=top;
						 top=p;
						 break;
					 }
			 case '*':	
			 case '/':
						string2[j]=' ';j++;
						if((top->data=='*')||(top->data=='/'))
						{
						string2[j]=top->data;j++; //比其高,现将栈顶运算符出栈,再进栈。
							top->data=a;
							break;
						}
						else
						{			
							p=(struct node *)malloc(sizeof(struct node));//否,直接进栈
							p->data=a;p->next=top;
							top=p;
							break;
						}

			 case '+':
			 case '-':{
						string2[j]=' ';j++;
						if(top->data=='+'||top->data=='-'||top->data=='*'||top->data=='/')
						{
							string2[j]=top->data;j++;;
							top->data=a;
							break;
						}
						else 
							{
								p=(struct node *)malloc(sizeof(struct node));
								p->data=a;p->next=top;
								top=p;
								break;
							}

					}
			  case ')':{
						string2[j]=' ';j++;
						if(top->data=='@'){printf("input error");break;}
						while(top->data!='(')
						{
							string2[j]=top->data;j++;
							p=top;
							top=top->next;							
							free(p);
						}
                        p=top;top=top->next;free(p);
						break;
					}
			}
		
		}
		
	}
	while(top->data!='@')
		{
			string2[j]=top->data;j++;
			p=top;
			top=top->next;
			free(p);
		}
	string2[j]='#';
    printf("转化后的后缀表达式为:%s\n",string2);
	return top;
}
struct node *calcolate(struct node *s)
{
	struct node *top,*p;
	char *q;
	int x,y,a;
	int i,n;
	top=s;//指向栈顶的指针
	for(i=0;i<=j;i++)//遍历字符串string2
	{
		if(string2[i]>='0'&&string2[i]<='9')
		{
			q=&string2[i];
			a=atoi(q);
            for(n=i;string2[n]>='0'&&string2[n]<='9';n++){}
			p=(struct node *)malloc(sizeof(struct node ));
			p->num=a;p->next=top;top=p;
			i=n-1;
		}
		else
			if(string2[i]=='#')   //遇#号结束标志,输出栈中的最后计算结果
				printf("计算结果为:%d\n",top->num);
			else
			{
				if(string2[i]==' '){}
				else
				{
				y=top->num;p=top;top=top->next;free(p);
				x=top->num;p=top;top=top->next;free(p);
				switch(string2[i])
				{case '+':{a=x+y;
				           p=(struct node *)malloc(sizeof(struct node));
						   p->num=a;p->next=top;top=p;
						   break;}
				 case '-':{a=x-y;
						  p=(struct node *)malloc(sizeof(struct node ));
						  p->num=a;p->next=top;top=p;
						  break;}
				 case '*':{a=x*y;
						  p=(struct node *)malloc(sizeof(struct node ));
						  p->num=a;p->next=top;top=p;
						  break;}
				 case '/':{a=(float)x/y;
					      p=(struct node *)malloc(sizeof(struct node ));
						  p->num=a;p->next=top;top=p;
						  break;}
				}
				}
			}			
	}
	return 0;
}
main()
{
	struct node *top,*head;
	int m;
	top=Initialization();//建立一个链栈,并返回栈顶指针
	printf("请输入表达式:");
	head=assort(top);//中缀转化为后缀表达式
	calcolate(head);//后缀表达式的计算
}

运行结果:


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值