栈
一,实现栈
int s[100005],tot=0;
#define push(x) s[++tot]=x
#define pop tot--
#define size tot
#define top s[tot]
二,这个东西虽然有点简陋,但还是可以的。
我觉得把这个东西按照,我习惯的结构体改一下。
1 struct stack 2 { 3 int tot=0; 4 int s[1000005]; 5 void push(int x) 6 { 7 s[++tot]=x; 8 } 9 void pop() 10 { 11 tot--; 12 } 13 //必有出栈入栈 14 int size() 15 { 16 return tot; 17 } 18 int top() 19 { 20 return s[tot]; 21 } 22 //说实话,这两个操作就有点奇怪了。 23 //返回栈顶元素和栈内元素个数。 24 }q;
三,
你想过结构题内最后两个功能为什么队列和栈不一样嘛?
噢,。。front和top一样的意思。
只是最后一个功能不一样,
队列是empty(),栈是size()
说实话我感觉这两个一样。
四,
(上面写的不错,可惜我要的是单调栈)
单调栈洛谷有一道模板题。
P5788。
1,我用非单调队列做了一遍。。还得了个一半多的分
1 #include<iostream> 2 using namespace std; 3 int n,s[10000005],ans[100005]; 4 int main(){ 5 cin>>n; 6 for(int i=1;i<=n;i++) 7 cin>>s[i]; 8 for(int i=1;i<=n;i++) 9 { 10 int mark=s[i]; 11 12 for(int j=i;j<=n;j++) 13 { 14 15 if(s[j]>mark) 16 { 17 ans[i]=j; 18 break; 19 } 20 } 21 } 22 for(int i=1;i<=n-1;i++) 23 cout<<ans[i]<<" "; 24 cout<<"0"; 25 26 }
2,当然要考虑怎么用单调栈。
你知道我设计的单调栈问题出在哪了吗?就比如拿样例说话
5 1 4 2 3 5
当你考虑第二个的时候,不停地往进放,当你放到第四个元素,也就是3的时候,因为每次跟栈顶比较,3比2大,此时记录的是4,
但是,你要比的是4.。你要比四大的数唉。