程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题

#include<iostream>
#include<vector>
using namespace std;
class stack
{
private:
	vector<int> vec;//用来保存当前进栈的值
    vector<int> max_vec;
public:
	void push(int a)
	{
		vec.push_back(a);
		if(max_vec.size()==0||a>vec[max_vec[max_vec.size()-1]])
		{
			max_vec.push_back(vec.size()-1);
		}
	}

	int pop()
	{
		if(vec.size()==0)
			return 0;
		if(vec.size()-1==max_vec[max_vec.size()-1])
		{
			max_vec.pop_back();
		}
		int d=vec[vec.size()-1];
		vec.pop_back();
		return d;
	}
	bool empty()
	{
		return max_vec.size()==0;
	}
	int max_value()
	{
		if(!vec.empty())
		{
		int max_pos=max_vec[max_vec.size()-1];
		return vec[max_pos];
		}
		return -1000;
	}
};
class queue
{
private:
	stack a,b;
public:
	void enqueue(int a)
	{
		b.push(a);
	}
	void delete_queue()
	{
		if(a.empty())
		{
			while(!b.empty())
			{
				a.push(b.pop());
			}
		}
		a.pop();
	}
	int max()
	{
		return a.max_value()>b.max_value()?a.max_value():b.max_value();
	}
};
int main()
{
	queue q1;
	q1.enqueue(1);
	q1.enqueue(3);
	q1.enqueue(2);
	q1.delete_queue();
	q1.delete_queue();
	cout<<q1.max()<<endl;
	system("pause");
	return 0;
}

时间: 2024-10-07 14:10:51

程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题的相关文章

编程之美之队列中取最大值操作

问题: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v): 将v加入队列中 2. DeQueue(): 使队列中的队首元素删除并返回此元素 3. MaxElement: 返回队列中的最大元素 设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低. #include<iostream> #include<limits.h> using namespace std; class Stack { public: Stack() { stackTop =

&lt;&lt;编程之美&gt;&gt; -- 队列中取最大值操作的问题

不得不说编程之美是一本好书,虽然很多题目在做acm中的过程中遇到过,不过还是有很多值得思考的地方 这是今天在编程之美上看到的一个问题,对于栈转化成队列的一个思考 平时都太过依赖c++内函数库中的栈和队列,但是对于他们的扩展我们还是应该自己进行手写栈和队列来实现更简单的算法 题目大意: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v) : 将 v 加入队列 2. DeQueue: 使队列中队首元素删除并返回此元素 3.MaxElement: 返回队列中的最大元素 设计一种数据结构和算

编程之美---队列中取最大值操作问题

如何快速获取队列中的最大值? 最简单的办法,用一个for循环遍历,复杂度为o(n). 解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素. 解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈. 1 class stack 2 { 3 public: 4 stack() 5 { 6 stackTop = -1; 7 maxItemIndex =

编程之美——队列中取最大值操作

为实现O(1)的时间复杂度完成取队列中最大元素,使用maxStackItemIndex记录队列(使用两个栈实现)中最大元素下标,使用数组link2NextMaxItem[]记录数组中次大值的下标,这也就是使用两个栈(先进后出)模拟队列二不是直接使用队列(先进先出)的原因:先进后出可以保证当执行pop操作(pop出最大值)时可以更新maxStackItemIndex=link2NextMaxItem[stackTop]:而队列则不具有这种回溯特性: 代码: 1 #include<iostream>

第3章 结构之法——字符串移位包含的问题

字符串移位包含的问题 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter3jiegouzhifa.QuestionOfStringMove; 2 /** 3 * 字符串移位包含的问题 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringMove { 9 /** 10 * 寻找移位后的字串(左移) 11 * @param src 源字符串 12 * @param des 要查找的子串 13 * @ret

第三章结构之法--------字符串移位包含

字符串移位包含的问题 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含. 例如,给定s1=AABCD和s2=CDAA,s1可以通过向右移动两位,s1------>BCDAA,使得s1包含s2,返回true. 而对于s1=ABCD和s2=ACBD,无论s1怎么移动,都无法包含s2,则返回false. 分析与解法 解法1: 这一道题,一开始我并没有想到什么好的解题思路.首先想到的是用暴力枚举的方法,将所有移位后字符串都 列举出来,在进行判断.并且移动的次

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

第3章 结构之法——电话号码对应英语单词

电话号码对应英语单词 问题描述 分析与解法 详细代码如下: 1 package chapter3jiegouzhifa.TelephoneMapWords; 2 /** 3 * 电话号码对应英语单词 4 * @author DELL 5 * 6 */ 7 public class TelephoneMapWords1 { 8 private int telLength; //电话号码的位数 9 private char c[][]={ //各个数字所能代表的字符 10 "".toCha

第3章 结构之法——计算字符串的相似度

计算字符串的相似度 问题描述 分析与解法 具体代码如下: 1 package chapter3jiegouzhifa.StringSimilarity; 2 /** 3 * 计算字符串的相似度 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringSimilarity { 9 public static int CalculateStringDistance(String str1, int b1, int e1, String str