c++:实现一个栈,包括入栈、出栈函数以及返回最小值,要求时间复杂度为O(1)

MinStakc.cpp

#include<iostream>
using namespace std;
#include<stack>
template<class T>
class Stack{
public:
 void Push(const T& x){                       //入栈
  _stack.push(x);
  if (_minstack.empty())
   _minstack.push(x);
  else{
   _minstack.push((_minstack.top() > x )? x : _minstack.top());
  }
 }
 void Pop(){            //出栈
  _stack.pop();
  _minstack.pop();
 }
 T GetMin(){             //栈的最小值
  cout << _minstack.top() << endl;
  return _minstack.top();
 }
private:
 stack<T> _stack;
 stack<T> _minstack;
};
void test(){
 Stack<int> s;
 s.Push(1);
 s.Push(2);
 s.Push(5);
 s.Push(7);
 s.Push(8);
 s.GetMin();
 s.Pop();
 s.GetMin();
 s.Pop();
 s.GetMin();
 s.Pop();
}
int main(){
 test();
 return 0;
}
时间: 2024-08-03 23:37:55

c++:实现一个栈,包括入栈、出栈函数以及返回最小值,要求时间复杂度为O(1)的相关文章

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步

给定入栈顺序,判断出栈顺序是否正确。

1 var ins = [1, 2, 3, 4, 5]; 2 var outs = [3, 4, 5, 2, 1]; 3 var temp = ins; 4 var num, i = 0, len; 5 6 /** 7 * ins 入栈顺序 8 * outs 出栈顺序 9 * temp 临时数组,保存入栈顺序 10 * num 是临时数组中 当前出栈节点的下标 11 * len 临时数组的长度-1 12 * 13 */ 14 (function (temp, outs) { 15 if(ins

n个元素的入栈顺序有多少种出栈顺序?

问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的分析过程如下: n个数据依次入栈,出栈顺序种数的递推公式如下:F(n)=∑(F(n-1-k)*Fk);其中k从0到n-1 已知F0=1,F1=F0*F0=1F2=F1*F0+F0*F1=2F3=F2*F0+F1*F1+F0*F2=5F4=F3*F0+F2*F1+F1*F2+F0*F3=14F5=F4

顺序栈的进栈,出栈

1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX 100 4 5 typedef struct 6 { 7 char c[MAX]; 8 int top; 9 }*seqstack; 10 11 void InitStack(seqstack s);//建立一个空栈 12 int push(seqstack s,char a);//进栈 13 int pop(seqstack s,char *a);//出栈 14 15 i

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

C++中栈的出栈,入栈规则:A,B,C,D,E

考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CDABE   d.  DCBEA 分析: 1.假定进栈序列是从小到大排练的(即A<B<C<D<E),则出栈序列中不可能有  “大小中”这种序列,因为在“大数”出栈后,在栈中“中数”是在“小数”上面的,所以只能是先出“中数”再出“小数”2.出栈序列中如包含下列序列则是错误的:CAB,DAB

编程实现栈的入栈/出栈操作

完整代码如下,其实队栈都只是链表的一种变化而已 #include <stdio.h> #include <stdlib.h> typedef struct student * PNode; typedef struct stacklink * PStack; typedef struct student { int data; PNode next; }Node; typedef struct stacklink { PNode zhandi; PNode top; }Stack;

元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5)。出栈序列为(4,5,3,2,1)

元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5).出栈序列为(4,5,3,2,1) 思路: 1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈: 2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空. 3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走: 4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的. 下面用图说明 开始栈为空 入栈序列第一个元素入栈后