我是靠谱客的博主 美好缘分,最近开发中收集的这篇文章主要介绍数据结构--栈-C语言实现生成后缀表达式(没有计算表达式,仅仅生成),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数据结构–栈-C语言实现生成后缀表达式

前言

生成后缀表达式的代码是参考B站严蔚敏数据结构视频(版本很老),和现在《数据结构》上面的伪代码思路不一样。这里的算符(operator)仅仅涉及加、减、乘,除,另外”(“、”(“以及”#“作为分隔符(delimeter)也算作算符。算符是为了和操作数(operand)区分。
算符之间的优先关系参考《数据结构》这本书,上面定义的很详细。
本代码仅仅用了两个表达式检验程序,仅供参考,另外注释写得也很少,代码也未优化,请见谅。
运行环境:Dev-C++

思路

请添加图片描述

请添加图片描述

代码

/*
*预定义常量和类型 
*00_state.h
*/

#ifndef __00_STATE_H__
#define __00_STATE_H__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<windows.h>


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;

#endif
/*
*02_stack_expression.h
*/
#include"00_state.h"

#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACK_INCREMENT 10//存储空间分配增量

typedef char StackElemType;

typedef struct{
	StackElemType *base;
	StackElemType *top;
	int stacksize;//当前已经分配的存储空间 
}stack;


Status stack_init(stack * pstack);//构造空栈 
Status get_top(stack stack_,StackElemType *e);//获取栈顶元素
Status pop(stack *pstack,StackElemType *e);
Status stack_empty(stack stack_);
Status push(stack *pstack,StackElemType e);


/*
*02_stack_expression.cpp
*/

#include"02_stack_expression.h"

typedef enum Relationship{
	GREATER,
	LESS,
	EQUAL,
	NONE//没有关系 
}Relate;

Relate rm[7][7] = {};
Status stack_init(stack * pstack)//构造空栈
{
	pstack->base = (StackElemType*)malloc(STACK_INIT_SIZE*sizeof(StackElemType));
	if(!pstack->base)
		exit(OVERFLOW);
	pstack->top = pstack->base;
	pstack->stacksize = STACK_INIT_SIZE;
	return OK;
}
Status get_top(stack stack_,StackElemType *e)//获取栈顶元素
{
	if(stack_.top == stack_.base)
		exit(1);
	*e = *(stack_.top-1);
	return TRUE;
}

Status push(stack *pstack,StackElemType e)
{
	if(pstack->top-pstack->base>=pstack->stacksize)//指针相减
	{
		pstack->base = (StackElemType*)realloc(pstack->base,(pstack->stacksize+STACK_INCREMENT)*sizeof(StackElemType));
		if(!pstack->base)
			exit(OVERFLOW);
		pstack->top=pstack->base+pstack->stacksize;
		pstack->stacksize+=STACK_INCREMENT;
		
	}
	*(pstack->top) = e;//先赋值,然后指针上移
	pstack->top++; 
	return OK;
}

Status pop(stack *pstack,StackElemType *e)
{
	if(pstack->top==pstack->base) 
	{
		printf("栈为空n");
		return ERROR;
	}
	else
	{
		pstack->top--;//先指针下移,然后赋值
		*e = *(pstack->top);
		return OK; 
	}
}

Status stack_empty(stack stack_)
{
	return stack_.base == stack_.top?TRUE:FALSE;
}

Status stack_trverse(stack stack_)
{
	if(stack_.top == stack_.base)
	{
		printf("栈为空...n");
		return ERROR;
	}
	else
	{
		StackElemType  *p_trverse = stack_.base;
		printf("栈元素遍历...n");
		int i = 0;
		while(p_trverse<stack_.top)
		{
			printf("元素%d:%cn",++i,*p_trverse++);	
		}
	}
}
void print_rm(Relate rm[7][7])
{
	//打印测试 
	int i = 0;
	int j = 0;
	for(;i<7;i++)
	{
		for(j = 0;j<7;j++)
		{
			switch(rm[i][j])
			{
				case GREATER:
					printf(">t");
					break;
				case LESS:
					printf("<t");
					break;
				case EQUAL:
					printf("=t");
					break;
				case NONE:
					printf("Nt");
					break;	
			}
			
		}
		printf("n");
	}
}
void get_ralationship_martrix(Relate rm[7][7])//relationship_martrix[][] 缩写rm[][] 
{
	//算符排列顺序:+,-,*,/,(,),#;
	int i = 0; 
	int j=0;
	while(j<2)
	{
		rm[i][j] = GREATER;
		j++;
	}
	while(j<5)
	{
		rm[i][j] = LESS;
		j++;
	}
	while(j<7)
	{
		rm[i][j] = GREATER;
		j++;
	}
	
	//第二行 
	j = 0;
	i = 1;
	
	while(j<2)
	{
		rm[i][j] = GREATER;
		j++;
	}
	while(j<5)
	{
		rm[i][j] = LESS;
		j++;
	}
	while(j<7)
	{
		rm[i][j] = GREATER;
		j++;
	} 
	
	//第三行
	j = 0;
	i = 2;
	
	while(j<4)
	{
		rm[i][j] = GREATER;
		j++;
	}

	rm[i][j] = LESS;
	j++;
	
	while(j<7)
	{
		rm[i][j] = GREATER;
		j++;
	}  
	//第四行
	 
	j = 0;
	i = 3;
	
	while(j<4)
	{
		rm[i][j] = GREATER;
		j++;
	}

	rm[i][j] = LESS;
	j++;
	
	while(j<7)
	{
		rm[i][j] = GREATER;
		j++;
	}  
	
	//第五行
	j = 0;
	i = 4;
	
	while(j<5)
	{
		rm[i][j] = LESS;
		j++;
	}
	rm[i][j] = EQUAL;
	j++;
	rm[i][j] = NONE;
	
	//第六行
	 j = 0;
	i = 5;
	
	while(j<4)
	{
		rm[i][j] = GREATER;
		j++;
	}
	rm[i][j] = NONE;
	j++;
	while(j<7)
	{
		rm[i][j] = GREATER;
		j++;
	}
	
	//第七行
	i = 6;
	j = 0;
	while(j<5)
	{
		rm[i][j] = LESS;
		j++;
	}
	rm[i][j] = NONE;
	j++;
	rm[i][j] = EQUAL; 
	
	
	
}


///
/*
*运算符仅包括加减乘除、小括号 、'#'
*分界符(delimeter)和操作符统称为算符 
*/
Status in_operators(char ch)
{
	switch(ch)
	{
		case '+':
			break;
		case '-':
			break;
		case '*':
			break;
		case '/':
			break;
		case '(':
			break;
		case ')':
			break;
		case '#':
			break;
		default:
			return FALSE;
	}
	return TRUE;
}


Status precede(char pre_char,char post_char)//
{

	char operatos[7] = {'+','-','*','/','(',')','#'};
	int a = 0,b = 0;
	for(int i = 0;i<7;i++)
	{
		if(pre_char ==operatos[i])
		{
			a = i;
			break;
		}
	}
	
	for(int i = 0;i<7;i++)
	{
		if(post_char ==operatos[i])
		{
			b = i;
			break;
		}
	}
	
	return rm[a][b]==GREATER?TRUE:FALSE;//
}
void generate_suffix_expression(char *source,stack *stack_expression)//重点 
{
	stack stack_;
	stack_init(&stack_);//初始化一个栈用来存放操作符(OPERATOR)
	push(&stack_,'#');
	char *p_char_source = source;//用来遍历 
	
	char ch=*p_char_source;
	
	while(!stack_empty(stack_))
	{
		if(!in_operators(ch))//符号不属于操作符,就作为操作数直接放到后缀表达式中 
		{
			push(stack_expression,ch);
		}			
		else//属于操作符
		{
			switch(ch)
			{
				case '(':
					push(&stack_,ch);break;//左括号入栈
				case ')':
					char c1;
					pop(&stack_,&c1);
					while(c1!='(')//将括号里面的操作符号出栈传递给后缀表达式 
					{
						push(stack_expression,c1);
						pop(&stack_,&c1);	
					}
					break;	
				default: //'#'或者加减乘除 
					char c2;
					while(get_top(stack_,&c2)&&precede(c2,ch))//栈顶运算符高于新来的运算符 
					{
						push(stack_expression,c2);
						pop(&stack_,&c2);
					}
					if(ch!='#')
						push(&stack_,ch);
					else if(ch=='#'&&c2=='#')
					{
						pop(&stack_,&c2);
					}
					break;	
			}	
		}
		
		if(ch!='#')//遍历 
		{
			p_char_source++;
			ch=*p_char_source;
		}
	
			
	} 
	stack_trverse(*stack_expression);	
	
}

int main()
{
	get_ralationship_martrix(rm);//relationship_martrix[][] 缩写rm[][] 
	char source[] = "a*b+(c-d/e)*f#";//"a*b+(c-d/e)*f#" -> "ab*cde/-f*+" ;"a*(b-c)#"  ->"abc-*"
	stack stack_expression;
	stack_init(&stack_expression);
	generate_suffix_expression(source,&stack_expression);
	
	return 0;
}

结果

在这里插入图片描述

最后

以上就是美好缘分为你收集整理的数据结构--栈-C语言实现生成后缀表达式(没有计算表达式,仅仅生成)的全部内容,希望文章能够帮你解决数据结构--栈-C语言实现生成后缀表达式(没有计算表达式,仅仅生成)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部