栈的应用二之逆波兰表达式

逆波兰表达式

      逆波兰表达式又称后缀表达式,它的表示方法通常都是操作数在前,操作符在后。

         比如: 通常                                逆波兰表达式

                     1+2                                 1 2 +

                2-3*4/5                                 2 3 4 * - 5 /

         12*(3+4)-6+8/2                      12 3 4 + * 6 - 8 2 / +

      分析:

      先取到一个字符:

                1.数字。     压栈

                2.表达式。 从栈中拿到表达式前边两个数(出栈),

                                  一个数为表达式右边的数,第二个为表达式左边的数

                                  在除法运算中,第二个数不能为0;

看代码:

sum.h

#ifndef __STACK_H__ 
#define __STACK_H__ 

typedef int DataType;
enum xxx
{
	ADD,
	SUB,
	MID,
	DIV,
	DATA,
};
typedef struct cell
{
	char SIZE;
	int data;
}CELL;
typedef struct Node
{
	DataType data[10];
	int sz;
}Stack;
void Initstack(Stack * stack);
void Pushstack(Stack * stack, DataType d);
void Popstack(Stack * stack);
int  Topstack(Stack  stack);
int  PostfixExpression(const CELL* str,int size);
#endif 

sum.c

#include"sum.h"
#include<assert.h>
#include<stdio.h>
#include<string.h>
void Initstack(Stack * stack)
{
	assert(stack!=NULL);
	memset(stack, sizeof(stack->data), 4);
	stack->sz = 0;
}
void Pushstack(Stack * stack, DataType d)//压栈
{
	assert(stack != NULL);
	stack->data[stack->sz] = d;
	stack->sz++;
}
void Popstack(Stack * stack)//出栈
{
	assert(stack != NULL);
	stack->data[stack->sz - 1] = 0;
	stack->sz--;
}
int  Topstack(Stack  stack)
{
	return stack.data[stack.sz - 1];
}
int  PostfixExpression(const CELL* str, int size)
{
	Stack stack;
	Initstack(&stack);
	int i = 0;
	for (i = 0; i < size; i++)
	{
		if (str[i].SIZE == DATA)//取出字符为数字
		{
			Pushstack(&stack,str[i].data);
		}
		else//取出字符为表达式
		{
			int left = 0;
			int right = 0;
			right = Topstack(stack);
			Popstack(&stack);
			left = Topstack(stack);
			Popstack(&stack);
			switch (str[i].SIZE)
			{
			case ADD:
				Pushstack(&stack, left + right);
				break;
			case SUB:
				Pushstack(&stack, left - right);
				break;
			case MID:
				Pushstack(&stack, left * right);
				break;
			case DIV:
				if (right == 0)//除数是否为0?
				{
					return 0;
				}
				else
					Pushstack(&stack, left / right);
				break;
			}
		}
	}
	return Topstack(stack);
}

test.c 

#include<windows.h>
#include<stdio.h>
#include"sum.h"

int main()
{
	CELL cell[] = { { DATA, 12 }, { DATA, 3 }, { DATA, 4 }, { ADD, 0 }, { MID, 0 }, { DATA, 6 }, { SUB, 0 }, { DATA, 8 }, { DATA, 2 }, { DIV, 0 }, { ADD, 12 } };
	int size = sizeof(cell)/sizeof(cell[0]);
	int ret = PostfixExpression(cell, size);
	if (ret == 0)
		printf("除数为0,不符合运算规则\n");
	else
		printf("%d\n", ret);
	system("pause");
	return 0;
}

                                   

猜你喜欢

转载自blog.csdn.net/oldwang1999/article/details/81806493