算法题C++(一)

最近在刷算法题,发表出来与大家分享,有错误还望指出,

本博客目录

  • 实现返回最小元素功能的栈结构
  • 用队列实现栈结构
  • 用栈实现队列结构

实现一个特殊的栈

在实现栈功能的基础上,在返回实现栈中最小元素的操作

要求:

  • pop,push,getMin操作时间复杂度为O(1)
  • 可以使用现成的栈结构

用两个栈来实现,栈1正常存储,来一个数压栈一个。栈2实现最小元素,当新来的数比栈顶元素小时,压入新来的,大于栈顶元素时,重复压入栈顶元素。

#include <iostream>
#include <stack>

using namespace std;

class getminStack
{
public:
	getminStack();
	~getminStack();

	void push(int num);
	int pop();
	int top();
	int getmin();



private:
	stack<int> stack1;
	stack<int> stack2;
};
#include "getminStack.h"

getminStack::getminStack()
{
}


getminStack::~getminStack()
{
}

void getminStack::push(int num) {
	stack1.push(num);
	if (stack2.empty()) {
		stack2.push(num);
	}
	else {
		if (num < stack2.top()) {
			stack2.push(num);
		}
		else {
			stack2.push(stack2.top());
		}
	}
}
int getminStack::top() {
	return stack1.top();
}

int getminStack::pop() {
	int i = stack1.top();
	stack2.pop();
	stack1.pop();
	return i;
}

int getminStack::getmin() {
	if (stack2.empty) {
		cout << "Error, the stack is empty!" << endl;
	}
	return stack2.top();
}

用队列实现栈结构

用两个队列实现一个栈,当需要压入数时,往一个固定的队列1中压入,需要弹出时,将队列1中的数弹出压入队列2,直到只剩下一个数为止,将最后一个数弹出,实现栈的弹出操作,将队列1和队列2交换,以便下次在往队列1中压入元素。
#include<queue>
#include<stack>
#include<iostream>

using namespace std;

class queueToStack
{
public:
	queueToStack();
	~queueToStack();

	void push(int num);
	int pop();
	int top();
	void swap();
private:
	queue<int> mainQueue;
	queue<int> help;

};
#include "queueToStack.h"



queueToStack::queueToStack()
{
}


queueToStack::~queueToStack()
{
}

void queueToStack::swap() {
	queue<int> tmp;
	tmp = mainQueue;
	mainQueue = help;
	help = tmp;
}

void queueToStack::push(int num) {
	mainQueue.push(num);
}

int queueToStack::pop() {
	if (mainQueue.empty()) {
		cout << "Error, the stack has no number!" << endl;
		return 0;
	}
	while (mainQueue.size() > 1){
		help.push(mainQueue.front());
		mainQueue.pop();
	}
	int tmp = mainQueue.front();
	mainQueue.pop();
	swap();
	return tmp;
}

int queueToStack::top() {
	if (mainQueue.empty()) {
		cout << "Error, the stack is empty" << endl;
		return 0;
	}
	while (mainQueue.size() != 1){
		help.push(mainQueue.front());
		mainQueue.pop();
	}
	int tmp = mainQueue.front();
	help.push(tmp);
	mainQueue.pop();
	swap();
	return tmp;
}

用栈实现队列操作

#include<iostream>
#include<stack>

using namespace std;

class stackToQueue
{
public:
	stackToQueue();
	~stackToQueue();

	void push(int num);
	int pop();
	int top();

private:
	stack<int> stack1;
	stack<int> stack2;
};
#include "stackToQueue.h"



stackToQueue::stackToQueue()
{
}


stackToQueue::~stackToQueue()
{
}

void stackToQueue::push(int num) {
	stack1.push(num);
}

int stackToQueue::pop() {
	if (stack1.empty() && stack2.empty()) {
		cout << "Error, the queue is empty!" << endl;
		return 0;
	}
	else if (stack2.empty()) {
		while (!stack1.empty()) {
			stack2.push(stack1.top());
			stack1.pop();
		}
	}
	int tmp = stack2.top();
	stack2.pop();
	return tmp;
}

int stackToQueue::top() {
	if (stack1.empty() && stack2.empty()) {
		cout << "Error, the queue is empty!" << endl;
		return 0;
	}
	else if (stack2.empty()) {
		while (!stack1.empty())
		{
			stack2.push(stack1.top());
			stack1.pop();
		}
	}
	return stack2.top();
}





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值