Infix to posfix 自己写stack,没有()

#include<iostream>
#include<string>
using namespace std;

template<typename Type>
struct Node
{
	Type data;
	Node<Type>*next;
};

template<typename Type>
class Stack
{
private:
	Node<Type>*head;
public:
	//构造函数
	Stack()
	{
		head = new Node<Type>;
		head->next = NULL;
	}
	//析构函数
	~Stack()
	{
		delete head;
	}
	//判空
	bool isEmpty()
	{
		if (head->next == NULL)
			return true;
		return false;
	}

	//入栈
	void push(Type item)
	{
		Node<Type>*p = new Node<Type>;
		p->data = item;
		p->next = head;
		head = p;
	}

	//出栈
	void pop()
	{
		if (isEmpty())
			return;
		else
		{
			Node<Type>*p = head;
			head = p->next;
			delete p;
		}
	}

	//取栈顶
	char top()
	{
		return head->data;
	}
};

//优先级判断
char compare(char opt, char si)
{
	if ((opt == ‘+‘ || opt == ‘-‘) && (si == ‘*‘ || si == ‘/‘))
		return ‘<‘;
	else if (opt == ‘#‘)
		return ‘<‘;
	return ‘>‘;
}

//判断是否为运算符
bool isOp(char c)
{
	if (c == ‘+‘ || c == ‘-‘ || c == ‘*‘ || c == ‘/‘)
		return true;
	return false;
}

int main()
{
	Stack<char>op;
	Stack<char>num;
	op.push(‘#‘);
	num.push(‘#‘);

	string s;
	cin >> s;

	for (int i = 0; i<s.size(); i++)
	{
		if (!isOp(s[i]))
			num.push(s[i]);
		else
		{
			char c = compare(op.top(), s[i]);
			if (c == ‘<‘)
				op.push(s[i]);
			else
			{
				num.push(op.top());
				op.pop();
				op.push(s[i]);
			}
		}
	}

	while (op.top() != ‘#‘)
	{
		num.push(op.top());
		op.pop();
	}

	string s1 = "";

	while (num.top() != ‘#‘)
	{
		s1 = s1 + num.top();
		num.pop();
	}

	for (int i = 0; i<s1.size() / 2; i++)
	{
		char temp = s1[i];
		s1[i] = s1[s1.size() - 1 - i];
		s1[s1.size() - 1 - i] = temp;
	}

	cout << s1 << endl;

	return 0;
}

  

时间: 2024-09-29 05:15:02

Infix to posfix 自己写stack,没有()的相关文章

20172303 2018-2019-1 《程序设计与数据结构》实验二报告

20172303 2018-2019-1 <程序设计与数据结构>实验二报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 范雯琪 学号:20172303 实验教师:王志强 助教:张师瑜/张之睿 实验日期:2018年11月5日 必修/选修: 必修 实验内容 本次实验主要是关于树的应用, 涉及了二叉树.决策树.表达式树.二叉查找树.红黑树五种树的类型,是对最近学习内容第十章和第十一章的一个总结. 节点一 参考教材P212,完成链树LinkedBinaryTree的实现(get

[编程题] 四则运算

[编程题] 四则运算 题目描述 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}" * 返回:算术表达式的计算结果 */ public static int calculate(String strExpression) { /* 请实现*/ return 0; } 约束: pucExpression字符串中的有效字符包括['0'-'9'],'+','-', '*','/' ,'('

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

(hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)

题目: ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 73 Accepted Submission(s): 57   Problem Description ACboy was kidnapped!! he miss his mother very much and is very

模板系列(一)模板的模板参数

在之前,我们写过类似的stack template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc cont_; }; 那么我们使用的时候,需要这样写 Stack<string, list<string>

无向图的基本算法

根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图. 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅由两个顶点连接,并且没有方向的图称为无向图. 在研究图之前,有一些定义需要明确,下图中表示了图的一些基本属性的含义,这里就不多说明. 图的API表示 在研究图之前,我们需要选用适当的数据结构来表示图,有时候,我们常被我们的直觉欺骗,如下图,这两个其实是一样的,这其实也是一个研究问题,就是如何判断图

templates(2.1)

Class Templates 类别模板 就像上一章所说的 functions 那样,classes 也可以针对一或多个类型被参数化.用来管理「各种 不同类型的元素」的 container classes(容器类别)就是典型例子.运用 class templates 你可以实 作出可包容各种类型的 container class.本章将以一个 stack class 作为 class templates /* The following code example is taken from th

浅谈算法和数据结构: 十二 无向图相关算法基础

从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记. 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图. 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅由两个顶点连接,并且没有方向的图称为无向图. 在研究图之前,有一些定义需要明确,下图中表示了图的一些基本属性的含义,这里就不多说明. 图的

C++ 《STL源码剖析》 序列类容器

关于序列容器就讲这么多了 slist stack queue后面就不再写 stack 和 queue 没有迭代器 底层实现也就是list slist单向list 在此,我总结了,vector,list ,deque使用区别:     1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector      2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list      3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque vector适用:对象数量变化