码迷,mamicode.com
首页 > 其他好文 > 详细

_DataStructure_C_Impl:后缀表达式

时间:2015-08-05 06:41:14      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:数据结构      

//_DataStructure_C_Impl:
#include<stdio.h>
#include<stdlib.h>
#define StackSize 100
typedef char DataType;
typedef struct{
	DataType stack[StackSize];
	int top;
}SeqStack;
//将栈初始化为空栈只需要把栈顶指针top置为
void InitStack(SeqStack *S){
	S->top=0;//把栈顶指针置为0
}
//判断栈是否为空,栈为空返回1,否则返回0
int StackEmpty(SeqStack S){
	if(S.top==0)
		return 1;
	else
		return 0;
}
//取栈顶元素。将栈顶元素值返回给e,并返回1表示成功;否则返回0表示失败。
int GetTop(SeqStack S,DataType *e){
	if(S.top<=0){		//在取栈顶元素之前,判断栈是否为空
		printf("栈已经空!\n");
		return 0;
	}else{
		*e=S.stack[S.top-1];	//在取栈顶元素
		return 1;
	}
}
//将元素e进栈,元素进栈成功返回1,否则返回0
int PushStack(SeqStack *S,DataType e){
	if(S->top>=StackSize){	//在元素进栈前,判断是否栈已经满
		printf("栈已满,不能进栈!\n");
		return 0;
	}else{
		S->stack[S->top]=e;	//元素e进栈
		S->top++;	//修改栈顶指针
		return 1;
	}
}
//出栈操作。将栈顶元素出栈,并将其赋值给e。出栈成功返回1,否则返回0
int PopStack(SeqStack *S,DataType *e){
	if(S->top<=0){	//元素出栈之前,判断栈是否为空
		printf("栈已经没有元素,不能出栈!\n");
		return 0;
	}else{
		S->top--;	//先修改栈顶指针,即出栈
		*e=S->stack[S->top]; //将出栈元素赋值给e
		return 1;
	}
}
//求栈的长度,即栈中元素个数,栈顶指针的值就等于栈中元素的个数
int StackLength(SeqStack S){
	return S.top;
}
//清空栈的操作
void ClearStack(SeqStack *S){
	S->top=0;
}
//===================================
#include<string.h>
#define MaxSize 50
typedef struct{
	float data[MaxSize];
	int top;
}OpStack;	//操作数栈的类型定义

//将中缀表达式转换为后缀表达式
void TranslateExpress(char str[],char exp[]){
	SeqStack S;
	char ch;
	DataType e;
	int i=0,j=0;
	InitStack(&S);
	ch=str[i];
	i++;
	while(ch!='\0'){
		switch(ch){
		case '(':		//左括号入栈
			PushStack(&S,ch);
			break;
		case ')':		//如果当前字符是右括号,则将栈中的字符出栈,直到栈中的一个左括号出栈为止
			while(GetTop(S,&e)&&e!='('){
				PopStack(&S,&e);
				exp[j]=e;
				j++;
			}
			PopStack(&S,&e);	//左括号出栈
			break;
		case '+':
		case '-':
			while(!StackEmpty(S)&&GetTop(S,&e)&&e!='('){	//如果当前字符是+号或-号,则将栈中字符出栈,直到遇到左括号为止
				PopStack(&S,&e);
				exp[j]=e;
				j++;
			}
			PushStack(&S,ch);	//将当前字符入栈
			break;
		case '*':
		case '/':
			while(!StackEmpty(S)&&GetTop(S,&e)&&e=='/'||e=='*'){		//如果当前字符是*号或者是/号,则将栈中字符出栈
				PopStack(&S,&e);
				exp[j]=e;
				j++;
			}
			PushStack(&S,ch);		//当前字符入栈
			break;
		case ' ':
			break;
		default:		//处理数字字符
			while(ch>='0'&&ch<='9'){
				exp[j]=ch;
				j++;
				ch=str[i];
				i++;
			}
			i--;
			exp[j]=' ';
			j++;
		}
		ch=str[i];
		i++;
	}
	while(!StackEmpty(S)){
		PopStack(&S,&e);
		exp[j]=e;
		j++;
	}
	exp[j]='\0';
}
//计算后缀表达式的值
float ComputeExpress(char a[]){
	OpStack S;
	int i=0;
	int value;
	float x1,x2;
	float result;
	S.top=-1;
	while(a[i]!='\0'){
		if(a[i]!=' '&&a[i]>='0'&&a[i]<='9'){	//如果当前字符是数字字符,则将其转换为数字并存入栈中
			value=0;
			while(a[i]!=' '){
				value=10* value+a[i]-'0';
				i++;
			}
			S.top++;
			S.data[S.top]=value;
		}else{	//如果当前字符是运算符,则对栈中的数据进行求值,并将结果保存到栈中
			switch(a[i]){
			case '+':
				x1=S.data[S.top];
				S.top--;
				x2=S.data[S.top];
				S.top--;
				result=x1+x2;
				S.top++;
				S.data[S.top]=result;
				break;
			case '-':
				x1=S.data[S.top];
				S.top--;
				x2=S.data[S.top];
				S.top--;
				result=x2-x1;
				S.top++;
				S.data[S.top]=result;
				break;
			case '*':
				x1=S.data[S.top];
				S.top--;
				x2=S.data[S.top];
				S.top--;
				result=x1*x2;
				S.top++;
				S.data[S.top]=result;
				break;
			case '/':
				x1=S.data[S.top];
				S.top--;
				x2=S.data[S.top];
				S.top--;
				result=x2/x1;
				S.top++;
				S.data[S.top]=result;
				break;
			}
			i++;
		}
	}
	if(!S.top!=-1){
		result=S.data[S.top];
		S.top--;
		if(S.top==-1)
			return result;
		else{
			printf("表达式错误");
			exit(-1);
		}
	}
}
void main()
{
	char a[MaxSize],b[MaxSize];
	float f;
	printf("请输入一个算术表达式:\n");
	gets(a);
	printf("中缀表达式为:%s\n",a);
	TranslateExpress(a,b);
	printf("后缀表达式为:%s\n",b);
	f=ComputeExpress(b);
	printf("计算结果:%f\n",f);
	system("pause");
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

_DataStructure_C_Impl:后缀表达式

标签:数据结构      

原文地址:http://blog.csdn.net/williamfan21c/article/details/47288499

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!