手记


#include<bits/stdc++.h>

#include<malloc.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

struct Stack

{

    int len;

    int *base,*top;

};

bool empty(Stack *s){return s->base==s->top;}

int size(Stack *s)

{

    return s->top-s->base;

}

void build(Stack *s,int n)

{

    s->base=(int *)malloc(sizeof(int)*n);

    s->len=n,s->top=s->base;

}

void push(Stack *s,int val)

{

    if(s->top-s->base==s->len)return;

    *s->top++=val;

}

int pop(Stack *s)

{

    if(empty(s))return *s->top;

    return *--s->top;

}

int front(Stack *s)

{

    if(empty(s))return -1;

    return *(s->top-1);

}

void clear(Stack *s)

{

    if(s->base)free(s->base);

}

int main()

{

    Stack p;

    build(&p,5);

    for(int i=0;i<5;i++)

    {

        int x;cin>>x;

        push(&p,x);

    }

    while(!empty(&p))

    {

        cout<<pop(&p)<<endl;

    }

}

栈2

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef struct

{

    int *base;

    int *top;

    int stacksize;  

}SqStack;

#define Status int

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

#define OK 1

#define ERROR 0

#define INFEASIBLE  -1

#define OVERFLOW  -2

/*

Status InitStack(SqStack &S);//构造空栈

Status DestroyStack(SqStack &S);// 销毁栈

Status ClearStack(SqStack &S);// 情空栈

Status StackEmpty(SqStack S);// 判断是否为空栈

int StackLength(SqStack S);// 栈的长度

Status GetTop(SqStack S);// 栈顶元素

Status Push(SqStack &S,int &e);// 入栈

Status Pop(SqStack &S,int &e);// 出栈

Status Stacktravel(SqStack S);// 遍历

*/

struct STACK

{

    Status InitStack(SqStack &S)

    {

        S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));

        if(!S.base)exit(OVERFLOW);

        S.top=S.base;

        S.stacksize=STACK_INIT_SIZE;

        return OK;

    }

    Status GetTop(SqStack S,int &e)

    {

        if(S.top==S.base)return ERROR;

        e=*(S.top-1);return OK;

    }   

    Status Push(SqStack &S,int e)

    {

        if(S.top-S.base>=S.stacksize)

        {

            S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));

            if(!S.base)exit(OVERFLOW);

            S.top=S.base+S.stacksize;

        }

        *S.top++=e;

        return OK;

    }

    Status Pop(SqStack &S,int &e)

    {

        if(S.top==S.base)return ERROR;

        e=*--S.top;

        return OK;

    }

    int StackLength(SqStack S){return S.top-S.base;}

    Status StackEmpty(SqStack S){return S.top==S.base;}

    Status Stacktravel(SqStack S)

    {

        for(int i=0;i<StackLength(S);i++)

        {

            printf("%d ",S.base[i]);

        }

    }

    Status DestroyStack(SqStack &S)

    {

        S.base=S.top;

    }

};

int main()

{

    SqStack node;

    STACK Stack;

    Stack.InitStack(node);

    for(int i=0;i^5;i++)

    {

        int e;cin>>e;

        Stack.Push(node,e);

    }

}

单调栈

#include<iostream>

const int N=105;

int main()

{

     int d[N];int n;std::cin>>n;

     int top=0;int a[N];

     int L[N],R[N];

     for(int i=0;i<n;i++)std::cin>>a[i];

     for(int i=0;i<n;i++)

     {

          while(top>0&&a[d[top]]>=a[i])top--;

          if(top=0)L[i]=0;else L[i]=top+1;

          d[top]=i;

     }

     top=0;

     for(int i=n-1;i>=0;i--)

     {

          while(top>0&&a[d[top]]>=a[i])top--;

          if(top==0)R[i]=n;else R[i]=top;

          d[top]=i;

     }

}

 /*         for(int i=0;i<n;i++)

          {

               scanf("%lld%lld",w+i,h+i);

               sum[i+1]=sum[i]+w[i];

               while(!d1.empty()&&h[d1.top()]>=h[i])d1.pop();

               if(d1.empty())L[i]=0;else L[i]=d1.top()+1;

               d1.push(i);

          }

          for(int i=n-1;i>=0;i--)

          {

               while(!d2.empty()&&h[d2.top()]>=h[i])d2.pop();

               if(d2.empty())R[i]=n;else R[i]=d2.top();

               d2.push(i);

          }

*/

©著作权归作者所有:来自51CTO博客作者qinXpeng的原创作品,如需转载,请注明出处,否则将追究法律责任


0人推荐
随时随地看视频
慕课网APP