//数据结构--栈
什么是栈:
栈实际上也是线性表的一种,只是他比较特殊,为什么特殊呢?因为他一端是封闭的,不允许进行插入和删除元素操作,另一端是开口
,允许进行插入和删除元素操作。
栈的特点:
栈的特点是先进后出,后进先出。比如:
我拿一个箱子,要往里面放书,先放:
数学书一本
英文书一本
化学书一本
程序设计书一本
现在我要将这些书全部拿出来,顺序就是
数学书
英文书
化学书
程序设计书
从上面的这个例子看到先进后出,后进先出,这个就是一个现实生活中一个栈的抽象例子。
好了,现在理解了什么是栈,那么现在我们开始用C语言来实现栈。
在写代码前我们先来看看栈中的一些名词:
入栈:往栈中插入一个元素,我们称之为入栈运算;
出栈:从栈中删除一个元素,我们称之为出栈运算;
问来又来了,我们进行一系列的插入和删除操作后,我们怎么知道栈,是否还有空间进行插入新元素。和栈是否为空;
这时是不是就得用一个标识来记录呢!就得用一个指向栈顶的变量。这样我们进行插入和删除操作时,就可以通过指向
栈顶的这个指针来判断当前栈的状态了;
变量意思:
//--------------------------------------------
//s 栈存储空间
//m 栈存储空间容量
//top 栈顶指针;
//x 入栈元素
//--------------------------------------------
下面是C语言代码实现:
//建立空栈:
//入栈运算
//退栈运算
//读栈顶
//状态检查
//输出所有元素
例子:
什么是栈:
栈实际上也是线性表的一种,只是他比较特殊,为什么特殊呢?因为他一端是封闭的,不允许进行插入和删除元素操作,另一端是开口
,允许进行插入和删除元素操作。
栈的特点:
栈的特点是先进后出,后进先出。比如:
我拿一个箱子,要往里面放书,先放:
数学书一本
英文书一本
化学书一本
程序设计书一本
现在我要将这些书全部拿出来,顺序就是
数学书
英文书
化学书
程序设计书
从上面的这个例子看到先进后出,后进先出,这个就是一个现实生活中一个栈的抽象例子。
好了,现在理解了什么是栈,那么现在我们开始用C语言来实现栈。
在写代码前我们先来看看栈中的一些名词:
入栈:往栈中插入一个元素,我们称之为入栈运算;
出栈:从栈中删除一个元素,我们称之为出栈运算;
问来又来了,我们进行一系列的插入和删除操作后,我们怎么知道栈,是否还有空间进行插入新元素。和栈是否为空;
这时是不是就得用一个标识来记录呢!就得用一个指向栈顶的变量。这样我们进行插入和删除操作时,就可以通过指向
栈顶的这个指针来判断当前栈的状态了;
变量意思:
//--------------------------------------------
//s 栈存储空间
//m 栈存储空间容量
//top 栈顶指针;
//x 入栈元素
//--------------------------------------------
下面是C语言代码实现:
//建立空栈:
#include <stdio.h>
void main()
{
int m, top;
int * s;
s = (int*)malloc(m * sizeof(int)); //动态申请容量为m的存储空间;
top = 0; //栈顶指针为0,表示此时栈为空;
return;
}
//入栈运算
void push(int * s, int m, int * top, int x)
{
if(*top == m)
{printf("Stack-overfolw!\n");return;} //检查栈是否已满;
* top = * top + 1;
s[top - 1] = x;
return;
}
//退栈运算
int pop(int * v, int *top)
{
int y;
if(*top == 0)
{printf("Stack-Underflow!\n");return;}
y = v[*top -1];
* top = * top - 1;
return (y);
}
//读栈顶
int read(int * v, int *top)
{
int y;
if(*top == 0 )
{printf("Stack_underflow!\n");return;}
y = v[*top - 1];
return (y);
}
//状态检查
int flag(int *top, int m)
{
if(*top == m) return (-1);
if(*top == 0) return ( 0);
return(1);
}
//输出所有元素
void prt_elem(int *v, int * top)
{
int i;
printf("top: %d\n",*top);
for(i = 0; i < *top; i++)
printf("%d\n",v[i]);
return;
}
例子:
#include <stdio.h>
#include <malloc.h>
//进栈
void push(int *v, int *top, int m, int i)
{
if(*top == m)
{printf("Stack_overflow!\n");return;}
* top = * top + 1;
v[*top - 1] = i;
return;
}
//退栈
int pop(int * v, int * top)
{
int y;
if(*top == 0)
{
printf("Stack_underflow!\n");
return 0;
}
y = v[*top-1];
*top = * top - 1;
return (y);
}
//读栈
int read(int * v, int *top)
{
int y;
if(*top == 0)
{
printf("stack_underflow!\n");
return 0;
}
y = v[*top - 1];
return (y);
}
//状态检查;
int flag_stack(int * top, int m)
{
if(*top == m) return (-1); //上溢
if(*top == 0) return ( 0); //栈为空;
return (1);
}
//输出栈中所有元素
void prt_stack(int *v, int *top)
{
int i;
printf("top: %d\n",*top);
for(i =0; i < *top; i++)
printf("%d\n",v[i]);
return;
}
void main()
{
int * v, top, m, i, x;
m = 5; //建立一个能存放十个整形数据的一个栈;
v = (int*)malloc(m * sizeof(int));
top = 0; //初始化栈课为空;
//进行对栈的操作;
if(flag_stack(&top,m)!=-1)
{
push(v,&top,m,34);
}else
{
printf("push fail!\n");
}
if(flag_stack(&top,m)!=-1)
{
push(v,&top,m,324);
}else
{
printf("push fail!\n");
}
if(flag_stack(&top,m)!=-1)
{
push(v,&top,m,334);
}else
{
printf("push fail!\n");
}
if(flag_stack(&top,m)!=-1)
{
push(v,&top,m,3334);
}else
{
printf("push fail!\n");
}
if(flag_stack(&top,m)!=-1)
{
push(v,&top,m,334);
}else
{
printf("push fail!\n");
}
if(flag_stack(&top,m)!=-1) //在插入第六个元素时,已超出栈的容量,故不会进行插入操作了,这时会提示错误!
{
push(v,&top,m,34);
}else
{
printf("push fail!\n");
}
prt_stack(v,&top);
printf("----------------------------\n");
// int result;
printf("pop number is : %d\n",pop(v,&top));
printf("read stack top : %d\n",read(v,&top));
prt_stack(v,&top);
}
/*-------------运行结果--------------
push fail!
top: 5
34
324
334
3334
334
----------------------------
pop number is : 334
read stack top : 3334
top: 4
34
324
334
3334
Press any key to continue
*/