一、栈的定义和特点
栈是限制在一端进行插入操作和删除操作的线性表,允许进行操作的一端称之为“栈顶”,另一端固定称为“栈底”,当栈中没有元素时称为“空栈”。
根据它的特性我们得知,栈的特点是“后进先出”(LIFO)。
由于栈也是线性逻辑结构,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,使得实现栈的基本运算的算法也有所不同。
二、顺序栈的概述运算及特点
顺序栈它是线性逻辑结构顺序存储的一种,具有和顺序表同样的存储结构,由数组定义,配合用数组下标表示栈顶指针top完成各种操作。下面我直接将顺序栈的概述运算用代码的方式展现出来。
seqstack.h:
/*
作者:张小五
时间:2018年1月29日
*/
#ifndef SEQSTACK_H_
#define SEQSTACK_H_
#define maxsize 64 //栈的容量
#define TRUE 1
#define FALSE 0
typedef struct{
int data[maxsize]; //用数组作为栈的存储空间
int top; //指示栈顶的位置
}seqStack,*seqStackP; //顺序栈的类型定义以及定义指向顺序镇的指针
void CreateStack(seqStackP S); //建栈
void SetStack(seqStackP S);//置空栈
int IsEmpty(seqStackP S);//判空栈
seqStackP PushStack(seqStackP S,int x);//元素进栈
int GetStack(seqStackP S);//取栈顶元素
int ShowStack(seqStackP S);//去栈顶元素
void PopStack(seqStackP S);//元素出栈
#endif // SEQSTACK_H_
seqstack.c:
/*
作者:张小五
时间:2018年1月29日
*/
#include "seqstack.h"
#include "stdio.h"
//建栈
void CreateStack(seqStackP S){
S->top = -1;
int i = 1;
int data;
do{
printf("请输入第%d个元素:",i);
scanf("%d",&data);
if(data!=-1){
S->top++;
S->data[S->top] = data;
}
i++;
}while(i<maxsize&&data!=-1);
}
//置空栈
void SetStack(seqStackP S){
S->top = -1;
}
//判空栈
int IsEmpty(seqStackP S){
return ((S->top>=0)?FALSE:TRUE);
}
//元素进栈
seqStackP PushStack(seqStackP S,int x){
if(S->top == maxsize -1){
printf("栈溢出!\n");
return NULL;
}
S->top ++;
S->data[S->top] = x;
return S;
}
//取栈顶元素
int GetStack(seqStackP S){
if(IsEmpty(S)){
printf("栈元素为空!\n");
return NULL;
}
return S->data[S->top];
}
//去栈顶元素
int ShowStack(seqStackP S){
if(IsEmpty(S)){
printf("栈元素为空!\n");
return NULL;
}
return S->data[S->top--];
}
//元素出栈
void PopStack(seqStackP S){
if(IsEmpty(S)){
printf("栈元素为空!\n");
}else
printf("出栈元素为:\n");
while(S->top>=0){
printf("%d ",S->data[S->top]);
S->top--;
}
}
main.c:
/*
作者:张小五
时间:2018年1月29日
*/
#include "seqstack.h"
#include "stdio.h"
#include "seqstack.c"
int main(int args,char *argv[]){
//建栈
seqStackP S = (seqStackP)malloc(sizeof(seqStack));
CreateStack(S);
//出栈
PopStack(S);
return 0;
}
运行结果截图:
综上所述,顺序栈的特点是,由于栈的插入和删除操作存在它的特殊性,所以用顺序存储结构表示的栈并不存在插入删除数据元素是需要移动的问题,但栈容量难以扩充的弱点仍旧没有摆脱。
在顺序栈中有“上溢”和“下溢”的概念。顺序栈好比一个盒子,我们在里头放了一叠书,当我们要用书的时候只能从第一本开始拿,那当我们把书本放到这个栈中超过盒子的顶部时就已经放不下了,这是就是“上溢”,“上溢”也就是栈顶指针指向了栈的外面,显然是出错了。反之,当栈中已经没有书时,我们再去拿,发现没有数了,这就是“下溢”,“下溢”本身可以表示栈为空栈。