(堆栈的形式)中缀表达式转后缀表达式

原创 2018年04月16日 17:04:17

这是用堆栈的方式建立中缀表达式转后缀表达式的代码,这个代码我打了很久,一开始是在优酷上通过一个视频有关的思路讲解打出来的。


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXSIZE 20
#define STACKINCREMENT 10


typedef struct SNode *PtrToSNode;
struct SNode
{
	char *date;
	int Top;
	int Base;
	int MaxSize;
};
typedef PtrToSNode Stack;


Stack CreatStack(int MaxSize)
{
	Stack S = (Stack)malloc(sizeof(struct SNode));
	S->date = (char *)malloc(MaxSize*sizeof(char));
	S->Top = S->Base;
	S->MaxSize = MaxSize;
	return S;
}


void Push( Stack S, char X )
{   
    //增加内存 
	if( S->Top - S->Base >= S->MaxSize )
	{
		S->date = (char *)realloc(S->date, (S->MaxSize + STACKINCREMENT )*sizeof(char));
		if(!S->date)
		exit(0);
		
		S->Top = S->Base + S->MaxSize;
		S->MaxSize = S->MaxSize + STACKINCREMENT;
	}	
	S->date[(S->Top)++] = X;
  //  printf("\nS->Top=%d 符号为:%c\n",S->Top-1, S->date[S->Top-1] );
}
int StackLen(Stack S)
{
    return (S->Top-S->Base); 
}
char Pop(Stack S) 
{
	if( S->Top == S->Base )
	return 0;
//	printf("\n出来时 S->Top=%d 符号位:%c\n", S->Top-1, S->date[S->Top-1]);
	return (S->date[--S->Top]);
}


int main()
{
	Stack S;
	char c, k;
	S = CreatStack(MAXSIZE);
	printf("输入中缀表达式:");
	scanf("%c", &c);
	printf("后缀表达式为:");     
	while( c!='\n' )
	{       
		while( c>='0' && c<='9' )
		{   
			printf("%c", c);
			scanf("%c", &c);
			if( c<'0'||c>'9')
			printf(" ");
		}
		if( ')' == c )
        {
        	k = Pop(S);
        	while( '(' != k )
        	{
        		printf("%c ", k);
        		k = Pop(S);
        	}
        }
		else if( '+' == c || '-' == c )
        {	
             if(!StackLen(S))
			 Push(S, c);
        	 else
        	 {
        	 	do
        	 	{
        	 		k = Pop(S);
        	 		if( '(' == k )
        	 		{
        	 			Push(S, k);//-->在这里不能用c,要用k重新将'('符号收回栈中 
        	 		}
        	 		else
        	 		{
        	 			printf("%c ", k);
        	 		}
        	 	}while( StackLen(S) && '(' != k );
        	 	Push(S, c);
        	 }
        }
		else if( '*'==c || '/'==c || '('==c)
        {
        	Push(S, c);
        }
        else if('\n' == c)
        break;
		else
        {
        	printf("\n输入错误: 输入格式错误!\n");
        	return -1;
        }
		scanf("%c", &c);
	}
	while(StackLen(S))
	{
		k = Pop(S);
		printf("%c ", k);
	}
	return 0;
} 

//1+2*(2+3)-8/2

编译器用DEV C++


用堆栈把中缀表达式转化为后缀表达式

参考文章:http://www.cnblogs.com/mygmh/archive/2012/10/06/2713362.html 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出...
  • conjimmy
  • conjimmy
  • 2014-12-13 10:32:22
  • 4377

将中缀表达式转换为后缀表达式

中缀表达式:(6/2*3+9)/2+(3+1-1)*3+10/2 后缀表达式:6 2 / 3 * 9 + 2 / 3 1 + 1 - 3 * +10 2 / + 转换顺序如下: 实现代码...
  • yawinstake
  • yawinstake
  • 2016-12-27 00:12:46
  • 780

栈与队列(三)中缀表达式转后缀表达式

中缀表达式=》后缀(逆波兰)表达式 例如:1+2=>1 2 + 分析原理:利用栈的记忆,符号推入栈,数字直接输出,当然有些时候在推入符号前,要先将栈内的元素Pop出来计算,再压入 具体分析1+(2...
  • w_linux
  • w_linux
  • 2017-02-09 18:20:19
  • 561

利用栈将中缀表达式转换为后缀表达式

  • 2010年07月30日 18:54
  • 4KB
  • 下载

利用栈将中缀表达式转换成后缀表达式

目的:将中缀表达式(即标准形式的表达式)转换为后缀式。 例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+   转换原则: 1.当读到一个操作数时,立即将它放...
  • woshioosm
  • woshioosm
  • 2015-01-28 15:00:41
  • 1392

利用栈将简单中缀表达式转为后缀表达式的测试

/* 通过使用栈将简单四则运算中缀表达式转换为后缀表达式 * '+', '-', '*', '/', '(', ')'共六种符号 * 原理: 1. 运算优先级规则是从左至右, 先乘除后加减,...
  • u014440013
  • u014440013
  • 2014-11-11 16:49:21
  • 599

中缀表达式转后缀表达式求值(栈的应用)

咱们熟悉的四则运算表达式,中缀表达式,例如 (12+3)*2-6/2 利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值   ...
  • l04205613
  • l04205613
  • 2012-07-28 20:47:14
  • 5653

堆栈实现中缀表达式转后缀表达式及计算表达式的值

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。算术表达式我们的普通表达式,后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行,( 3 + 4 ...
  • jiangjieqazwsx
  • jiangjieqazwsx
  • 2015-01-26 11:19:41
  • 766

java堆栈的应用--中缀表达式转换成后缀表达式和计算

  • 2012年05月22日 17:27
  • 15KB
  • 下载

栈的应用:中缀表达式转为后缀表达式(c语言实现)

中缀表达式: 中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。 后缀表达式:...
  • keepupblw
  • keepupblw
  • 2014-05-20 11:11:33
  • 6187
收藏助手
不良信息举报
您举报文章:(堆栈的形式)中缀表达式转后缀表达式
举报原因:
原因补充:

(最多只允许输入30个字)