栈和队列

Posted foreverys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈和队列相关的知识,希望对你有一定的参考价值。

栈实现的是一种后进先出(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!\\n");
    } else {
        printf("the stack is not empty!\\n");
    }
    push(s,9);
    push(s,12);
    printf("pop %d\\n",pop(s));
    printf("pop %d\\n",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.\\n");
        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\\n", dequeue(queue));
    printf("%d\\n", dequeue(queue));
    printf("%d\\n", dequeue(queue));
    printf("%d\\n", dequeue(queue));

}

void enqueue(int q[], int x)
{
    if(tail+1 == head) {
        printf("queue is overflow!\\n");
        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!\\n");
        exit(1);
    }
    
    x = q[head];
    if(head == ARRAY_SIZE-1)
        head=0;
    else
        head++;
    return x;
}

 

以上是关于栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列基本操作

栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

栈和队列知识点总结

栈和队列的面试题Java实现