1. 程式人生 > >L3-002 特殊堆棧 (30 分) 模擬stl

L3-002 特殊堆棧 (30 分) 模擬stl

tor col 特殊 gin lan begin 結構 如果 整數

  

堆棧是一種經典的後進先出的線性結構,相關的操作主要有“入棧”(在堆棧頂插入一個元素)和“出棧”(將棧頂元素返回並從堆棧中刪除)。本題要求你實現另一個附加的操作:“取中值”——即返回所有堆棧中元素鍵值的中值。給定 N 個元素,如果 N 是偶數,則中值定義為第 N/2 小元;若是奇數,則為第 (N+1)/2 小元。

輸入格式:

輸入的第一行是正整數 N(≤)。隨後 N 行,每行給出一句指令,為以下 3 種之一:

Push key
Pop
PeekMedian

其中 key 是不超過 1 的正整數;Push

表示“入棧”;Pop 表示“出棧”;PeekMedian 表示“取中值”。

輸出格式:

對每個 Push 操作,將 key 插入堆棧,無需輸出;對每個 PopPeekMedian 操作,在一行中輸出相應的返回值。若操作非法,則對應輸出 Invalid

輸入樣例:

17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop

輸出樣例:

Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid

用兩個vector 一個維護棧 一個維護中值
char 比string真的快了很多很多!!!!! 如果遇到大規模的題用char快
還有個就是用lowbound 而不是用find的細節
要在vector裏lowbound 用叠代器來接收地址
erase(it) it也是叠代器
技術分享圖片
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define
RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 1020 int main() { vector<int>v; vector<int>v2; int n; RI(n); char str[20]; vector<int>::iterator it; while(n--) { RS(str);//這裏用char 比string類型的快了100ms 讀寫真的影響很大 if(str[1]==u) { int x; RI(x); v.push_back(x); it=lower_bound(v2.begin(),v2.end(),x); v2.insert(it,x); } else if(str[1]==o) { if(!v.size())printf("Invalid\n"); else { cout<< v[ v.size()-1 ]<<endl; it=lower_bound(v2.begin(),v2.end(),v[v.size()-1] );//這裏用lowbound比find 快很多 因為已經排序好了 v2.erase(it); v.pop_back(); } } else { if(!v.size())printf("Invalid\n"); else printf("%d\n",v2[ (v2.size()-1)/2]); } } return 0; }
View Code





L3-002 特殊堆棧 (30 分) 模擬stl