Linux C学习第二十天

栈和队列:
栈:后进先出
添加元素:压栈
删除元素:出栈

栈的实现:
1.顺序栈。
2.链式栈

栈最顶端的元素叫栈顶元素。

顺序栈:
头文件:

#ifndef _STACK_H_
#define _STACK_H_

#define SIZE 10

typedef enum {FALSE, TRUE} BOOL;
typedef int Data;
typedef struct stack 
{
	Data data[SIZE];  // 栈存储空间
	int  top;         // 栈顶元素的下标
}Stack;

// 初始化栈
void Init(Stack *s);

// 判断空栈
BOOL Empty(Stack *s);

// 判断满栈
BOOL Full(Stack *s);

// 入栈
void Push(Stack *s, Data data);

// 出栈
void Pop(Stack *s);

// 获取栈顶元素
Data GetTop(Stack *s);

功能函数:

#include "stack.h"
#include <stdlib.h>
void Init(Stack *s)
{
	if (NULL == s)
		return;
	
	s->top = -1;
}

BOOL Empty(Stack *s)
{
	if (NULL == s)
		return FALSE;
	
	if (-1 == s->top)
		return TRUE;
	
	return FALSE;
}

BOOL Full(Stack *s)
{
	if (NULL == s)
		return FALSE;
	
	if (SIZE-1 == s->top)
		return TRUE;
	
	return FALSE;
}

void Push(Stack *s, Data data)
{
	if (NULL == s)
		return;
	
	if (Full(s) == TRUE)
		return;
	
	s->data[++s->top] = data;
}

void Pop(Stack *s)
{
	if (NULL == s)
		return;
	
	if (Empty(s) == TRUE)
		return;
	
	s->top--;
}

Data GetTop(Stack *s)
{
	if (NULL == s)
		return;
	
	if (Empty(s) == TRUE)
		exit(-1);  // 程序退出
	
	return s->data[s->top];
}


主函数:

#include <stdio.h>
#include "stack.h"

int main()
{
	Stack s;
	
	Init(&s);
	
	int i;
	for (i = 0; i < 10; i++)
	{
		Push(&s, i);
	}
	
	while (!Empty(&s))
	{
		Data data = GetTop(&s);
		printf ("%d\n", data);
		
		Pop(&s);
	}
	
	
	printf ("栈结束\n");
	return 0;
}


链式栈:
头文件:

#ifndef _STACK_H_
#define _STACK_H_

#define SIZE 10

typedef enum {FALSE, TRUE} BOOL;
typedef int Data;

typedef struct node
{
	Data data;
	struct node *next;
}Node;

typedef struct stack 
{
	Node *top;
}Stack;

// 初始化栈
void Init(Stack *s);

// 判断空栈
BOOL Empty(Stack *s);

// 入栈
void Push(Stack *s, Data data);

// 出栈
void Pop(Stack *s);

// 获取栈顶元素
Data GetTop(Stack *s);

 



#endif // _STACK_H_

功能函数:

#include "stack.h"
#include <stdlib.h>
void Init(Stack *s)
{
	if (NULL == s)
		return;
	
	s->top = NULL;
}

BOOL Empty(Stack *s)
{
	if (NULL == s)
		return FALSE;
	
	if (NULL == s->top)
		return TRUE;
	
	return FALSE;
}

void Push(Stack *s, Data data)
{
	if (NULL == s)
		return;
	
	Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
	if (NULL == node)
		return;
	
	node->data = data;
	node->next = s->top;
	s->top = node;
}

void Pop(Stack *s)
{
	if (NULL == s)
		return;
	
	if (Empty(s) == TRUE)
		return;
	
	Node *tmp = s->top;
	s->top = tmp->next;
	free(tmp);
}

Data GetTop(Stack *s)
{
	if (NULL == s)
		return;
	
	if (Empty(s) == TRUE)
		exit(-1);  // 程序退出
	
	return s->top->data;
}

主函数:

#include <stdio.h>
#include "stack.h"

int main()
{
	Stack s;
	
	Init(&s);
	
	int i;
	for (i = 0; i < 10; i++)
	{
		Push(&s, i);
	}
	
	while (!Empty(&s))
	{
		Data data = GetTop(&s);
		printf ("%d\n", data);
		
		Pop(&s);
	}
	
	
	printf ("栈结束\n");
	return 0;
}

队列:先进先出
有队头和队尾

顺序队列:
头文件:

#ifndef _QUEUE_H_
#define _QUEUE_H_

#define SIZE 20

typedef enum {FALSE, TRUE} BOOL;
typedef int Data;
typedef struct queue 
{
	Data  data[SIZE];   
	int front;    // 队头下标
	int rear;     // 队尾下标
}Queue;

// 初始化队列
void Init(Queue *s);

// 判断空队列
BOOL Empty(Queue *s);

// 判断满队列
BOOL Full(Queue *s);

// 入队列
void Push(Queue *s, Data data);

// 出队列
void Pop(Queue *s);

// 获取队头元素
Data GetTop(Queue *s);

功能函数:

#include "Queue.h"
#include <stdlib.h>
void Init(Queue *q)
{
	if (NULL == q)
		return;
	
	q->front = 0;
	q->rear  = 0;
}

BOOL Empty(Queue *q)
{
	if (NULL == q)
		return FALSE;
	
	if (q->rear == q->front)
		return TRUE;
	
	return FALSE;
}

BOOL Full(Queue *q)
{
	if (NULL == q)
		return FALSE;
	
	if ((q->rear+1)%SIZE == q->front)
		return TRUE;
	
	return FALSE;
}

void Push(Queue *q, Data data)
{
	if (NULL == q)
		return;
		
	if (Full(q) == TRUE)
		return;
	
	q->rear = (q->rear+1)%SIZE;
	q->data[q->rear] = data;
}

void Pop(Queue *q)
{
	if (NULL == q)
		return;
	
	if (Empty(q) == TRUE)
		return;

	q->front = (q->front+1)%SIZE;
}

Data GetTop(Queue *q)
{
	if (NULL == q)
		return;
	
	if (Empty(q) == TRUE)
		exit(-1);  // 程序退出
	
	return q->data[(q->front+1)%SIZE];
}


主函数:

#include <stdio.h>
#include "Queue.h"

int main()
{
	Queue q;
	Init(&q);
	
	int i;
	for (i = 0; i < 20; i++)
	{
		Push(&q, i);
	}
	
	
	while (!Empty(&q))
	{
		Data data = GetTop(&q);
		printf ("%d\n", data);
		Pop(&q);
	}
	
	return 0;
}


链式队列:
头文件:

#ifndef _QUEUE_H_
#define _QUEUE_H_

#define SIZE 10

typedef enum {FALSE, TRUE} BOOL;
typedef int Data;

typedef struct node
{
	Data data;
	struct node *next;
}Node;

typedef struct queue 
{
	Node *front;    // 队头指针
	Node *rear;     // 队尾指针
}Queue;

// 初始化队列
void Init(Queue *s);

// 判断空队列
BOOL Empty(Queue *s);

// 入队列
void Push(Queue *s, Data data);

// 出队列
void Pop(Queue *s);

// 获取队头元素
Data GetTop(Queue *s);

 



#endif // _QUEUE_H_

功能函数:

#include "Queue.h"
#include <stdlib.h>
void Init(Queue *q)
{
	if (NULL == q)
		return;
	
	q->front = NULL;
	q->rear  = NULL;
}

BOOL Empty(Queue *q)
{
	if (NULL == q)
		return FALSE;
	
	if (NULL == q->front)
		return TRUE;
	
	return FALSE;
}

void Push(Queue *q, Data data)
{
	if (NULL == q)
		return;
	
	Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
	if (NULL == node)
		return;
	
	node->data = data;
	node->next = NULL;
	if (q->rear != NULL)
	{
		q->rear->next = node;
		q->rear = node;
	}
	else
	{
		q->rear  = node;
		q->front = node;
	}
		
}

void Pop(Queue *q)
{
	if (NULL == q)
		return;
	
	if (Empty(q) == TRUE)
		return;
	
	Node *tmp = q->front;
	q->front = tmp->next;
	free(tmp);
	
	if (q->front == NULL)
		q->rear = NULL;
}

Data GetTop(Queue *q)
{
	if (NULL == q)
		return;
	
	if (Empty(q) == TRUE)
		exit(-1);  // 程序退出
	
	return q->front->data;
}



主函数:

#include <stdio.h>
#include "Queue.h"

int main()
{
	Queue q;
	Init(&q);
	
	int i;
	for (i = 0; i < 10; i++)
	{
		Push(&q, i);
	}
	
	
	while (!Empty(&q))
	{
		Data data = GetTop(&q);
		printf ("%d\n", data);
		Pop(&q);
	}
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值