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