栈和队列小结

栈和队列也经常用到:

1、栈

(1) 顺序栈

    常用操作:初始化、入栈、出栈、取得栈顶元素。

    上点代码:

    #define STACK_INIT_SIZE 100  //初始容量

    #define STACKINCREMENT 10 //容量增量

    typedef struct

    {

           SElemType *base;  //栈底指针  

           SElemType *top;    //栈顶指针

           int stacksize;          //当前存储容量      

    }//SqSatck

    status InitStack(SqStack &s)  //初始化栈

    {

            s.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));

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

            s.top=s.base;

            s.stacksize=STACK_INIT_SIZE;

            return OK;

    }//InitStack

   status GetTop(SqStack s,SElemType &e)  //取栈顶元素

   {

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

           e=*(s.top-1);

           return OK;

   }//GetTop

   status Push(SqStack &s,SElemType e) //入栈

   {

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

          {

                  newbase=(SElemType *)malloc(s.base,(s.stack+STACKINCREMENT)*sizeof(SElemType));

                  if(!newbase)  exit(OVERFLOW);

                  s.base=newbase;

                  s.top=s.base+s.stacksize;

                  s.stacksize+=STACKINCREMENT;

          }

          *s.top++=e;

           return OK;

   }//Push

    status Pop(SqStack s,SElemType &e)  //出栈

    {

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

           e=*--s.top;

           return OK;

    }//Pop

(2)双向栈(空间共享)

    两个栈共享一个存储空间的好处是节省存储空间,降低上溢发生的概率。

    定义方式:#define STACKSIZE 100

                     typedef struct{

                            SElemType base[STACKSIZE]; 

                            SElemType *top0,*top1;  // 定义两个栈顶指针,分别指向双向栈的两端 

                     }DuStack;

(3)链栈

    定义方式:typedef struct LiStack{

                            SElemType data;

                            struck LiStack *next;

                      };

    应用:前缀、中缀、后缀表达式

2、队列

(1)单链队列

   定义:typedef struct QNode

              {

                     QElemType data;

                     struct QNode *next;

              }QNode,*QueuePtr;

              typedef struct

              {

                     QueuePtr front; //队头指针 

                     QueuePtr  rear; //队尾指针    

              }LinkQueue;

(2)循环队列

          头指针(记为Q.front):如果队列不空,则指向当前队首元素;

          尾指针(0:如果队列不空,则指向当前队尾元素的下一个位置。

          队列空的条件:Q.front=Q.rear

          队列满的条件:(Q.rear+1)%maxsize=Q.front (队列实际容量 m=maxsize-1)

          队列长度:(Q.rear-Q.front+MAXQSIZE)%MAXSIZE;

          入队列:Q.base[Q.rear]=e;

                        Q.rear=(Q.rear+1)%maxsize;

          出队列:e=Q.base[Q.front];

                        Q.front=(Q.front+1)%maxsize; 

             

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值