今天我学习了一些有关栈和队列的基本算法,拿出来和大家分享一下。
首先我们要知道他们的定义:
(1)栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,栈又称为后进先出的线性表。
(2)队列:只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表。插入的叫队尾,删除的叫队头,对列具有先进先出的特性。
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<Windows.h>
//1. 利用顺序表实现栈
//函数接口:
typedef int SDataType;
typedef struct Stack {
SDataType array[100];
int top;
} Stack;
// 初始化
void StackInit(Stack *pStack)
{
assert(pStack);
pStack->top=0;
}
// 压栈
void StackPush(Stack *pStack, SDataType data)
{
assert(pStack);
assert(pStack->top<100);
pStack->array[pStack->top++]=data;
}
// 出栈
void StackPop(Stack *pStack)
{
assert(pStack);
assert(pStack->top>0);
pStack->top--;
}
// 返回栈顶元素
SDataType StackTop(Stack *pStack)
{
assert(pStack);
assert(pStack->top>0);
return pStack->array[pStack->top-1];
}
// 判断是否为空
// 1 空
// 0 不空
int StackIsEmpty(Stack *pStack)
{
return pStack->top==0?1:0;
}
// 返回数据个数
int StackSize(Stack *pStack)
{
return pStack->top;
}
//2. 利用单链表实现队列
//函数接口:
typedef int QDataType;
typedef struct QNode {
QDataType data;
struct QNode *pNext;
} QNode;
typedef struct Queue {
QNode *pFront;
QNode *pRear;
int size;
} Queue;
// 初始化
void QueueInit(Queue *pQueue)
{
assert(pQueue);
pQueue->pFront=pQueue->pRear=NULL;
pQueue->size=0;
}
// 入队列
void QueuePush(Queue *pQueue, QDataType data)
{
QNode *p=(QNode *)malloc(sizeof(QNode));
assert(pQueue);
pQueue->size++;
p->data=data;
p->pNext=NULL;
if(pQueue->pRear==NULL){
pQueue->pFront=pQueue->pRear=p;
}
pQueue->pRear->pNext=p;
pQueue->pRear=p;
}
// 出队列
void QueuePop(Queue *pQueue)
{
QNode *m;
assert(pQueue);
pQueue->size--;
m=pQueue->pFront;
if (pQueue->pFront == NULL) {
pQueue->pRear = NULL;
}
pQueue->pFront=m->pNext;
free(m);
}
// 返回队首元素
QDataType QueueFront(Queue *pQueue)
{
assert(pQueue);
return pQueue->pFront->data;
}
// 判断是否为空
// 1 空
// 0 不空
int QueueIsEmpty(Queue *pQueue)
{
assert(pQueue);
return pQueue->size==0?1:0;
}
// 返回数据个数
int QueueSize(Queue *pQueue)
{
assert(pQueue);
return pQueue->size;
}
以上就是栈和队列的基本算法,下次再给大家介绍一些经典的面试题做一做吧。