用后缀表达式计算

原创 2018年04月15日 01:59:00
///////.h
#define MAX_SIZE 1024
typedef int DataType; 

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

typedef enum
{
	ADD,SUB,MUL,DIV,DATA
}OPERATOR;
typedef struct Cell
{
	OPERATOR _op;
	int _data;
}Cell;

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"Stack.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void StackInit(Stack* s)
{
	assert(s);
	s->_top = 0;
} 

// 入栈 
void StackPush(Stack* s, DataType data)
{
	assert(s);
	if(MAX_SIZE == s->_top)
		printf("栈已满,放不了!!!");
	s->_array[s->_top++] = data;

}

// 出栈 
void StackPop(Stack* s)
{
	if(StackEmpty(s))
		return;
	s->_top--;
}

// 获取栈顶元素 
DataType StackTop(Stack* s)
{
	assert(s);
	assert(!StackEmpty(s));
	return s->_array[s->_top-1];
}

// 有效元素的个数 
int StackSize(Stack* s)
{
	assert(s);
	return s->_top;
}

// 检测栈是否为空 
int StackEmpty(Stack* s)
{
	assert(s);
	return s->_top == 0;
}



//////.c
int CalcRPN(Cell RPN[],int size)
{
	int i =0;
	Stack s;
	StackInit(&s);
	for(; i<size ; ++i)
	{
		if(DATA == RPN[i]._op)
			StackPush(&s,RPN[i]._data);
		else
		{
			int left = 0 , right = 0;
			right = StackTop(&s);
			StackPop(&s);
			switch(RPN[i]._op)
			{
			case ADD:
				StackPush(&s , left + right);
				break;
			case SUB:
				StackPush(&s , left - right);
				break;
			case MUL:
				StackPush(&s , left * right);
				break;
			case DIV:
				if(0 == right)
				{
					printf("除数为0,非法!\n");
					return 0;
				}
				StackPush(&s , left / right);
				break;
			}
		}
	}
	StackPop(&s);
}


void TestRPN()
{
	//12 3 4 + * 6 - 8 2 / +
	Cell RPN[]={{DATA,12},{DATA,3},{DATA,4},
	       {ADD,0},{MUL,0},{DATA,6},{SUB,0},
	      {DATA,8},{DATA,2},{DIV,0},{ADD,0}};
		   printf("%d\n",CalcRPN(RPN,sizeof(RPN)/sizeof(RPN[0])));
}
int main()
{
	TestRPN();
	system("pause");
	return 0;
}

QT项目五--计算器

1,简介这是用QT帮朋友做的一个定制化的计算器程序,他们对于计算器使用频率非常高,用系统自带的或网上找的软件也有很多地方不是很满意。提出了下列定制需求:(1)支持显示输入的历史记录,并拷贝复制。(2)...
  • dpsying
  • dpsying
  • 2017-01-06 15:29:38
  • 866

后缀表达式计算器代码

  • 2015年09月06日 17:10
  • 5KB
  • 下载

后缀表达式实现六则运算

实现后缀表达式的类如下,该类计算的是已经处理好的后缀表达式。 #include #include #include using namespace std; void StringDevid...
  • liuzhanchen1987
  • liuzhanchen1987
  • 2012-03-23 15:19:46
  • 1037

Qt计算器开发(三):运行效果及项目总结

这是我的Qt计算器项目开发的第三篇,主要内容是程序的运行效果,及整个工程的文件目录。还有我对于这个项目的一些总结,顺便吐槽一下MFC与Qt。...
  • guodongxiaren
  • guodongxiaren
  • 2014-05-17 11:13:08
  • 3740

用后缀表达式计算四则运算算法

1*2+3*4, 这个对应的中缀表达式就是[1,*,2,+,3,*,4], 需要转换成后缀表达式[1,2,*,3,4,*,+], 才能进一步计算得到结果.1.得到后缀表达式需要准备两个容器, 符号栈 ...
  • chuchus
  • chuchus
  • 2017-04-24 11:15:02
  • 864

Qt实现的简单计算器-计算简单表达式

此程序是在学习Qt的时候写的,Qt入门简单,了解布局之后能迅速实现自己想要的界面,布局是比较简单的部分,不写。算法可能是多数人包括我自己比较薄弱的地方,因此在这里做主要介绍。 学过编译原理或者离散数学...
  • baiding1123
  • baiding1123
  • 2013-12-03 20:15:39
  • 12161

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

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

QT中常规表达式例子

常规表达式例子: C:\Qt\Qt5.5.1\Examples\Qt-5.5\widgets\widgets\lineedits\lineedits.pro
  • ljt350740378
  • ljt350740378
  • 2016-04-18 11:36:49
  • 278

后缀数组入门题——2323后缀排序

题目大意:给定一个字符串,输出排名为1到n的后缀的起始位置 思路:按后缀数组的sa的定义,直接输出即可 code: #include #include using namespace std...
  • thy_asdf
  • thy_asdf
  • 2014-12-03 11:49:26
  • 501

Qt5.5做的计算器

前言:用Qt5做的简单的计算器,可以做四则运算。 代码: 1.头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include ...
  • shine_journey
  • shine_journey
  • 2016-03-22 01:28:15
  • 1466
收藏助手
不良信息举报
您举报文章:用后缀表达式计算
举报原因:
原因补充:

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