队列和栈详解

队列和栈

size:队列大小
head:头指针
tail:尾指针

队列性质:

1.先进先出(first in first out)
循环队列解决假溢出的问题
代码演示--顺序表实现
using namespace std;
typedef struct Vector {
        int * data;
        int size;
        int capatity;
} Vector ;
typedef struct Queue {
        Vector * data;
        int size;
        int head;
        int tail;
        int count;
} Queue ;
Vector * initVector( int n ) {
        Vector * v = ( Vector *)malloc( sizeof ( Vector ));
       v->size = 0;
       v->capatity = n ;
       v->data = ( int *)malloc( sizeof ( int ) * n );
        return v;
}
Queue *initQueue( int n ) {
        Queue * q=( Queue *)malloc( sizeof ( Queue ));
       q->data = initVector( n );
       q->size = n ;
       q->head = q->tail = q->count=0;
        return q;
}
int empty( Queue * q ) {
        if ( q == NULL ) return 1;
        return q ->count == 0;
}
int insertVector( Vector * v , int pos , int val ) {
        if ( pos < 0 || pos >= v ->capatity) return 0;
        v ->data[ pos ] = val ;
        v ->size += 1;
        return 1;
}
int push( Queue * q , int val ) {
        if ( q ->size == q ->count) return 0;
       insertVector( q ->data, q ->tail, val );
        q ->tail += 1;
        if ( q ->tail == q ->size) q ->tail = 0;
        q ->count += 1;
        return 1;
}
int vectorSeek( Vector * v , int pos ) {
        if ( pos < 0 || pos >= v ->capatity) return -1;
        return v ->data[ pos ];
}
int front( Queue * q ) {
        return vectorSeek( q ->data, q ->head);
}
int pop( Queue * q ) {
        if (empty( q )) return 0;
        q ->head += 1;
        q ->count -= 1;
        return 1;
}
void clearVector( Vector * v ) {
        if ( v == NULL ) return ;
       free( v ->data);
       free( v );
        return ;
}
void clearQueue( Queue * q ) {
        if ( q == NULL ) return ;
       clearVector( q ->data);
       free( q );
        return ;
}
void outputQueue( Queue * q ) {
       printf( "Queue:" );
        for ( int i = 0; i < q ->count; i++) {
              printf( "%4d " , vectorSeek( q ->data, ( q ->head + i) % q ->size));
       }
       printf( "\n\n" );
        return ;
}
int main() {
       srand(time(0));
#define MAX_OP 10
        Queue * q = initQueue(5);
        for ( int i = 0; i < MAX_OP ; i++) {
               int op = rand() % 5;
               int val = rand() % 100;
               switch (op) {
               case 0:
               case 1:
                      printf( "front of queue: %d\n" , front(q));
                      pop(q);
                       break ;
               case 2:
               case 3:
               case 4:
                      printf( "push %d to queue\n" , val);
                      push(q, val);
                       break ;
              }
              outputQueue(q);
       }
       clearQueue(q);
        return 0;
}
代码演示--链表
typedef struct Node {
        int data;
        Node * next;
} Node ;
typedef struct LinkList {
        Node head, *tail;
} LinkList ;
LinkList * initLinkList() {
        LinkList * l = ( LinkList *)malloc( sizeof ( LinkList ));
       l->head.next = NULL ;
       l->tail = &(l->head);
        return l;
}
Node * getNewNode( int val ) {
        Node * p = ( Node *)malloc( sizeof ( Node ));
       p->data = val ;
       p->next = NULL ;
        return p;
}
void clearLinkList( LinkList * l ) {
        Node * p = l ->head.next, * q;
        while (p) {
              q = p->next;
              free(p);
              p = q;
       }
       free( l );
}
typedef struct Queue {
        LinkList *l;
        int size, count;
} Queue ;
Queue * initQueue() {
        Queue * q = ( Queue *)malloc( sizeof ( Queue ));
       q->l = initLinkList();
       q->count = 0;
        return q;
}
int emptyList( LinkList * l ) {
        return l ->head.next == NULL ;
}
int frontList( LinkList * l ) {
        if (emptyList( l )) return 0;
        return l ->head.next->data;
}
int empty( Queue * q ) {
        return q ->count == 0;
}
int front( Queue * q ) {
        if (empty( q )) return 0;
        return frontList( q ->l);
}
int insertTail( LinkList * l , int val ) {
        Node * node = getNewNode( val );
        l ->tail->next = node;
        l ->tail = node;
        return 1;
}
int push( Queue * q , int val ) {
       insertTail( q ->l, val );
        q ->count += 1;
        return 1;
}
int eraseHead( LinkList * l ) {
        if (emptyList( l )) return 0;
        Node * p = l ->head.next;
        l ->head.next = p->next;
        if (p == l ->tail) l ->tail = &( l ->head);
       free(p);
        return 1;
}
int pop( Queue * q ) {
        if (empty( q )) return 0;
       eraseHead( q ->l);
        q ->count -= 1;
        return 1;
}
void clearQueue( Queue * q ) {
        if ( q == NULL ) return ;
       clearLinkList( q ->l);
       free( q );
        return ;
}
void outputQueue( Queue * q ) {
       printf( "Queue:" );
        Node * p = q ->l->head.next;
        for ( int i = 0; i < q ->count; i++ ,p=p->next) {
              printf( "%4d " ,p->data);
       }
       printf( "\n\n" );
        return ;
}
int main() {
       srand(( unsigned int )time(0));
#define MAX_OP 10
        Queue * q = initQueue();
        for ( int i = 0; i < MAX_OP ; i++) {
               int op = rand() % 5;
               int val = rand() % 100;
               switch (op) {
               case 0:
               case 1:
                      printf( "front of queue: %d\n" , front(q));
                      pop(q);
                       break ;
               case 2:
               case 3:
               case 4:
                      printf( "push %d to queue\n" , val);
                      push(q, val);
                       break ;
              }
              outputQueue(q);
       }
       clearQueue(q);
        return 0;
}

结构性质:先进后出(first in last out)
括号序列--栈的其中一种表现形式--也反映了函数的执行关系
由此可见,栈可以处理具有完全包含关系的问题
栈的代码演示
typedef struct Stack {
        int * data;
        int size, top;
} Stack ;
Stack * initStack( int n ) {
        Stack * s = ( Stack *)malloc( sizeof ( Stack ));
       s->data = ( int *)malloc( sizeof ( int ) * n );
       s->size = n ;
       s->top = -1;
        return s;
}
void clearStack( Stack * s ) {
        if ( s == NULL ) return ;
       free( s ->data);
       free( s );
        return ;
}
int empty( Stack * s ) {
        return s ->top == -1;
}
int top( Stack * s ) {
        if (empty( s )) return 0;
        return s ->data[ s ->top];
}
int push( Stack * s , int val ) {
        if ( s ->top + 1 == s ->size) return 0;
        s ->top += 1;
        s ->data[ s ->top] = val ;
        return 1;
}
int pop( Stack * s ) {
        if (empty( s )) return 0;
        s ->top -= 1;
        return 1;
}
void outputStack( Stack * s ) {
       printf( "Stack:" );
        for ( int i = s ->top; i >= 0; i--) {
              printf( "%4d" , s ->data[i]);
       }
       printf( "\n\n" );
        return ;
}
int main() {
       srand(( unsigned int )time(0));
        Stack * s = initStack(5);
#define MAX_OP 10
        for ( int i = 0; i < MAX_OP ; i++) {
               int op = rand() % 3, val = rand() % 100;
               switch (op) {
               case 0:
                      printf( "pop stack,item= %d\n" , top(s));
                      pop(s);
                       break ;
               case 1:
               case 2:
                      printf( "push stack, item =%d\n" , val);
                      push(s, val);
                       break ;
              }
              outputStack(s);
       }
       clearStack(s);
        return 0;
}
栈与队列的应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值