栈和队列

栈实现的是一种后进先出(last in, first-out, LIFO)策略。

本文利用数组实现了栈的三种操作:

PUSH(压入,即INSERT)

POP(弹出,即DELETE)

EMPTY(测试栈是否为空)

三种栈操作的执行时间都为O(1)

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int top=0;

int stack_empty(int s[]);
int push(int s[], int x);
int pop(int s[]);

int main(void)
{
    int s[10];
    if(stack_empty(s)) {
        printf("the stack is empty!
");
    } else {
        printf("the stack is not empty!
");
    }
    push(s,9);
    push(s,12);
    printf("pop %d
",pop(s));
    printf("pop %d
",pop(s));
    
}

int stack_empty(int s[])
{
    if(top==0)
        return TRUE;
    else return FALSE;
}

int push(int s[], int x)
{
    s[++top] = x;
}

int pop(int s[])
{
    if(stack_empty(s)) {
        printf("underflow.
");
        exit(1);
    } else {
        return s[top--];
    }
}

队列实现的是一种先进先出(first-in, first-out, FIFO)策略。

本例使用数组实现了循环队列,示意图如下:

它有下面2个操作

ENQUEUE(入队,即INSERT)

DELETE(出队,即DELETE)

两种操作的执行时间都为O(1)

/*
 * 利用数组实现循环队列
*/
#include <stdio.h>
#include <stdlib.h>

#define ARRAY_SIZE 10

void enqueue(int queue[], int x);
int dequeue(int queue[]);

int head,tail;
int queue[ARRAY_SIZE];

int main(void)
{
    enqueue(queue, 25);
    enqueue(queue, 37);
    enqueue(queue, 12);
    
    printf("%d
", dequeue(queue));
    printf("%d
", dequeue(queue));
    printf("%d
", dequeue(queue));
    printf("%d
", dequeue(queue));

}

void enqueue(int q[], int x)
{
    if(tail+1 == head) {
        printf("queue is overflow!
");
        exit(1);
    }
    
    q[tail] = x;
    if(tail == ARRAY_SIZE-1)
        tail=0;
    else
        tail++;
}

int dequeue(int q[])
{
    int x;
    
    if(tail == head) {
        printf("queue is underflow!
");
        exit(1);
    }
    
    x = q[head];
    if(head == ARRAY_SIZE-1)
        head=0;
    else
        head++;
    return x;
}
原文地址:https://www.cnblogs.com/yanxin880526/p/7468180.html