码迷,mamicode.com
首页 > 编程语言 > 详细

【数据结构】栈的应用——中缀表达式求值(c++)

时间:2015-06-09 11:55:50      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:数据结构      表达式求值   

头文件:


#pragma once

#include <iostream>
#include <assert.h>
#include <string>
using namespace std;

template<class Type>
class SeqStack
{
public:
	SeqStack(size_t sz = INIT_SZ);
	~SeqStack();
public:
	bool empty()const;
	bool full()const;
	void show()const;
	bool push(const Type &x);
	bool pop();
	void gettop(Type &x);
	int length()const;
	void clear();
	void destory();
	void quit_system(Type &x);
private:
	enum{ INIT_SZ = 64 };
	Type *base;
	int capacity;
	int top;
};

template<class Type>
SeqStack<Type>::SeqStack(size_t sz = INIT_SZ)
{
	capacity = sz > INIT_SZ ? sz : INIT_SZ;
	base = new Type[capacity];
	assert(base != NULL);
	top = 0;
}

template<class Type>
SeqStack<Type>::~SeqStack()
{
	destory();
}

// 判断栈是否满了
template<class Type>
bool SeqStack<Type>::full()const
{
	return (top >= capacity);
}

// 判断是否为空栈
template<class Type>
bool SeqStack<Type>::empty()const
{
	return (top == 0);
}

// 显示
template<class Type>
void SeqStack<Type>::show()const
{
	if (top == 0)
	{
		cout << "the stack is empty!" << endl;
		return;
	}
	for (int i = top - 1; i >= 0; --i)
	{
		cout << base[i] << endl;
	}
}

// 入栈
template<class Type>
bool SeqStack<Type>::push(const Type &x)
{
	if (full())
	{
		cout << "the stack is full,can not enter!" << endl;
		return false;
	}
	else
	{
		base[top] = x;
		top++;
		return true;
	}
}

// 出栈
template<class Type>
bool SeqStack<Type>::pop()
{
	if (empty())
	{
		cout << "the stack is empty,can not pop!" << endl;
		return false;
	}
	else
	{
		top--;
		return true;
	}
}

// 获得栈顶元素
template<class Type>
void SeqStack<Type>::gettop(Type &x)
{
	x = base[top - 1];
}

// 求栈长度
template<class Type>
int SeqStack<Type>::length()const
{
	return top;
}

// 清空栈
template<class Type>
void SeqStack<Type>::clear()
{
	top = 0;
}

// 摧毁栈
template<class Type>
void SeqStack<Type>::destory()
{
	delete[]base;
	base = NULL;
	capacity = top = 0;
}

// 退出系统
template<class Type>
void SeqStack<Type>::quit_system(Type &x)
{
	x = 0;
}


主函数:


#include "exp.h"

#include "exp.h"

//检查符号之间的优先级,1表示>,0表示=,-1表示<,c1栈内的运算,c2栈外的运算
int check(char c1, char c2)
{
	int a1, a2;
	if (c1 == '+' || c1 == '-')
		a1 = 3;
	if (c1 == '*' || c1 == '/')
		a1 = 5;
	if (c1 == '(')
		a1 = 1;
	if (c1 == ')')
		a1 = 7;
	if (c1 == '#')
		a1 = 0;

	if (c2 == '+' || c2 == '-')
		a2 = 2;
	if (c2 == '*' || c2 == '/')
		a2 = 4;
	if (c2 == '(')
		a2 = 6;
	if (c2 == ')')
		a1 = 1;
	if (c2 == '#')
		a2 = 0;

	if (a1 > a2)
		return 1;
	if (a1 == a2)
		return 0;
	if (a1 < a2)
		return -1;
}

//符号运算函数
double sum(char c, double d1, double d2)
{
	switch (c)
	{
	case '+':
		return d1 + d2;
		break;
	case '-':
		return d1 - d2;
		break;
	case '*':
		return d1 * d2;
		break;
	case '/':
		return d1 / d2;
		break;
	default:
		break;
	}
}

int main()
{
	char *op = "+-*/()#";
	string str;
	cin >> str;
	//给表达式字符串str添加‘#’结束标志符
	str.append(1, '#');
	SeqStack<char> OPTR;//运算符栈
	SeqStack<double> OPND;//操作数栈
	int a = -1;
	//先将'#'入栈
	OPTR.push('#');
	while (true)
	{
		int b = a + 1;
		a = str.find_first_of(op, a + 1);
		if (a == string::npos)
			break;
		if (a != b)
		{
			string ss(str, b, a - b);
			double d = atof(ss.c_str());
			//数据先入栈
			OPND.push(d);
		}
		//运算符优先级比较
		char val;
		OPTR.gettop(val);
		int che = check(val, str[a]);
		if (-1 == che)//栈外优先级大直接入栈
		{
			OPTR.push(str[a]);
		}
		if (0 == che)//栈内外优先级相等则出栈
		{
			OPTR.pop();
		}
		if (1 == che)//栈内优先级大,出栈进行运算
		{
			char val;
			OPTR.gettop(val);
			double d1;
			OPND.gettop(d1);
			OPND.pop();
			double d2;
			OPND.gettop(d2);
			OPND.pop();
			d1 = sum(val, d2, d1);
			//运算结果入栈
			OPND.push(d1);
			OPTR.pop();
			a--;
		}
	}
	double s;
	OPND.gettop(s);
	cout << s << endl;
	return 0;
}



技术分享

【数据结构】栈的应用——中缀表达式求值(c++)

标签:数据结构      表达式求值   

原文地址:http://blog.csdn.net/zhaoyaqian552/article/details/46424097

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!