数据结构与算法(十一)

连续存储(数组)
优点:存取速度快
缺点:插入、删除操作速度慢,空间通常有限制,事先必须知道数组的长度,需要大块连续内存。
离散存储(链表)
优点:插入删除的速度快,空间没有限制
缺点:存取速度慢
线性存储的应用:栈
内存有两种,动态内存和静态内存,静态内存是在栈里面分配的,动态内存是在堆里面分配的,局部变量和静态变量以压栈出栈的方式来存储的,由操作系统来完成,动态变量是以堆排序的方式来存储的,由程序员手动分配。
定义
一种可以实现“先进后出”的存储结构
分类
静态栈和动态栈
算法
压栈
出栈
清空
遍历

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

typedef struct Node
{
	int data;//数据域
	struct Node *pNext;//指针域,指向的数据类型与本身结构体的数据类型一样

}* P_N,N;//P_N<==>struct Node *,N<==>struct Node

typedef struct STACK
{
	P_N pTop;
	P_N pBottom;

}* P_S,S;

void init(P_S stack)
{
	stack->pTop = (P_N)malloc(sizeof(N));
	stack->pBottom = stack->pTop;
}

void push(P_S stack,int val)
{
	P_N pNew = (P_N)malloc(sizeof(N));
	pNew->data = val;

	P_N temp_node = stack->pTop;
	stack->pTop = pNew;
	pNew->pNext = temp_node;
	return;
}

void traverse_list(P_S stack)
{
	P_N p = stack->pTop;
	while(stack->pBottom != p)
	{
		printf("%d ",p->data);
		p = p->pNext;
	}
	printf("\n");
}

bool is_empty(P_S stack)
{
	if(stack->pBottom == stack->pTop)
		return true;
	else
		return false;
}
bool pop(P_S stack,int *val)
{
	if(is_empty(stack))
	{
		printf("出栈失败!\n");
		return false;
	}
	else
	{
		P_N r = stack->pTop;
		*val = r->data;
		stack->pTop = r->pNext;
		free(r);
	}
	return true;
}

clear(P_S stack)
{
	P_N p = stack->pTop;
	P_N q;
	while(p != stack->pBottom)
	{
		q = p->pNext;
		free(p);
		p = q;
	}
	stack->pTop = stack->pBottom;
}
int main(void)
{
	int val;
	S stack;
	init(&stack);
	push(&stack,1);
	push(&stack,2);
	push(&stack,3);
	push(&stack,4);
	traverse_list(&stack);
	if(pop(&stack,&val))
	{
		printf("出栈正确,pop的值为%d\n",val);
	}
	traverse_list(&stack);
	clear(&stack);
	traverse_list(&stack);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38530606/article/details/86431909