栈的应用之后缀表达式(逆波兰表达式)求值

要使用栈来实现逆波兰表达式的求值,就得先实现一个栈,并实现栈的一些基本操作:
首先 1. 实现栈的如下接口
typedef char DataType;

typedef struct Stack
{
DataType array[MAX_SIZE];
int _top; // 表示有效元素个数 表示栈顶位置
}Stack;

//初始化栈
void StackInit(Stack* s);

// 入栈
void StackPush(Stack* s, DataType data);

// 出栈
void StackPop(Stack* s);

// 获取栈顶元素
DataType StackTop(Stack* s);

// 有效元素的个数
int StackSize(Stack* s);

// 检测栈是否为空
int StackEmpty(Stack* s);

首先在头文件中声明这波基本操作:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//1. 实现栈的如下接口-- - 实现成动态栈
#define MAX_SIZE 10
typedef char DataType;

typedef struct Stack
{
	DataType _array[MAX_SIZE];
	int _top; // 表示有效元素个数 表示栈顶位置 
	//int _capacity; // 底层空间的总大小 
}Stack;


void StackInit(Stack* s);//初始化栈

// 入栈 
void StackPush(Stack* s, DataType data);

// 出栈 
void StackPop(Stack* s);

// 获取栈顶元素 
DataType StackTop(Stack* s);

// 有效元素的个数 
int StackSize(Stack* s);

// 检测栈是否为空 
int StackEmpty(Stack* s);

其次在.c文件中来实现这波基本操作:

#define _CRT_SECURE_NO_WARNINGS 
#include"stack.h"
void StackInit(Stack* s){
	assert(s);
	s->_top = 0;
}
// 入栈 
void StackPush(Stack* s, DataType data){
	assert(s);
	if (MAX_SIZE == s->_top){
		printf("栈已满!");
		return;
	}
	s->_array[s->_top] = data;
	(s->_top)++;
}
void StackPop(Stack* s){
	assert(s);
	if (StackEmpty(s)){
		printf("没有元素");
		return;
	}
	s->_top--;
}
// 获取栈顶元素 
DataType StackTop(Stack* s){
	assert(s);
	if (StackEmpty(s)){
		printf("没有元素");
		return;
	}
	return s->_array[s->_top-1];
}
// 检测栈是否为空 
int StackEmpty(Stack* s){
	assert(s);
	if (0 == s->_top){
		return 1;
	}
	return 0;
}
// 有效元素的个数 
int StackSize(Stack* s){
	return s->_top;
}

最后我们写个测试文件来利用以上基本操作来实现逆波兰表达式的求值:

#define _CRT_SECURE_NO_WARNINGS 
#include "stack.h"
int Findspace(char* pc,int i){//找到空格对应的数组下标并返回
	while (*pc!=' '){
		pc++;
		i++;
	}
	return i;
}
int main(){
	Stack s;
	StackInit(&s);
	char a[] = "12 3 4 +*";
	int i = 0;
	int len = strlen(a);
	for (i = 0; i < len; i++){
		if (a[i]>'0'&&a[i] < '9'){//如果是数字进行压栈操作
			StackPush(&s, atoi(&a[i]));
			i = Findspace(&a[i],i);
		}
		else
		{//如果不是数字,则出栈两个数字分别作为左右操作数来进行相应的操作,将结果重新入栈
			DataType right = StackTop(&s);
			StackPop(&s);
			DataType left = StackTop(&s);
			StackPop(&s);
			switch (a[i])
			{
			case '+':
				StackPush(&s, left + right);
				break;
			case '-':
				StackPush(&s, left - right);
				break;
			case '*':
				StackPush(&s, left * right);
				break;
			case '/':
				if (0 == right){
					return;
				}
				StackPush(&s, left / right);
				break;
			default:
				break;
			}
		}
	}
	DataType ret= StackTop(&s);
	printf("%d", ret);
	getchar();
}

输出结果:

猜你喜欢

转载自blog.csdn.net/superwangxinrui/article/details/79853932