栈,由两种基本操作组成,插入(推进)一个新项,和移除(弹出)一个最近插入的项。
栈有两种实现方式,一种是用数组的方式;另一种是用链表的方式;
数组实现的方式的缺点:
必须知道数组的最大长度,这样才能给数组分配内存。但是在实现栈过程中我们不知道具体该分配多大的内存,这样是用数组实现栈就会造成:
1.如果选择了一个任意大的数,这样空间是用将很低;
2.如果选择了一个较小的数,程序根本不可能运行;
如果是用链表则不会考虑长度的问题,它可以自动的增长和缩短。
下面主要介绍用链表实现栈的相关操作:
题目一:实现栈的入栈和出栈的操作。(其实就是单向链表的创建与删除的过程)
#include<stdio.h>
#include<stdlib.h>
//定义一个要压缩的数据结构
typedef struct data{
int num;
data *next;
} data;
//定义一个栈的结构
typedef struct stack{
data* bottom;
data* top;
} stack;
//初始化一个栈
static stack* head;
void initial_stack(){
head = (stack*)malloc(sizeof(stack));
head->bottom =NULL;
}
//压入栈的操作
stack* push(int new_num){
data *new_data;
new_data = (data*) malloc(sizeof(data));
new_data->num = new_num;
//对初始化后的栈结构进行相应的处理
if(head->bottom==NULL){
head->top = new_data;
head->bottom = new_data->next;
}else{
//栈内已经存入数据之后进行的相应处理
new_data->next = head->top;
head->top = new_data;
}
printf("压入%d\n",new_num);
return head;
}
//弹出栈的操作
stack* pop(){
data *temp;
if(head->top != head->bottom){
temp = head->top->next;
printf("弹出%d\n",head->top->num);
free(head->top);//释放空间
head->top=temp;
return head;
}else{
return NULL;
}
}
//主体测试函数
int main(){
initial_stack();
for(int i=0;i<10;i++){
head = push(i);
}
while(head=pop());
system("pause");
return 0;
}