堆栈(Stack)是一种简单和常用的数据结构,用户只能在指定的一端插入元素,并在同一端删除元素,因而元素的插入和删除具有后进先出LIFO(Last-In-First-Out)的特性。
基本知识
允许插入和删除元素的一端称为栈顶,而另外一端称为栈底。若栈中无元素,则称为空栈。
常见的基本运算:
#include<stdio.h>
#define Maxsize 50
#define FALSE 0
#define TRUE 1
typedef int BOOL;
typedef int T;
typedef struct stack{
int Top,Maxstack; //栈的最大允许长度为Maxstack,Top指向栈顶元素
T Elements[Maxsize];
}Stack;
//构造一个空栈,令栈顶指针Top=-1.栈的容量是Maxstack由用户通过参数maxsize指定,但是不能超过Maxsize
void CreateStack(Stack *s,int maxsize){
s->Top=-1;
s->Maxstack=maxsize;
}
//若栈为空,则返回TRUE,否则返回FALSE
BOOL IsEmpty(Stack s){
return s.Top<0;
}
//若堆栈已满,则返回TRUE,否则返回FALSE
BOOL IsFull(Stack s){
return s.Top>=s.Maxstack-1;
}
//进栈,若堆栈已满,则输出OVERFLOW,否则值为x的新元素进栈,成为栈顶元素
void Push(Stack *s,T x)
{
if(IsFull(*s)) printf("OVERFLOW");
else
s->Elements[++s->Top]=x;
}
//出栈,若堆栈为空,则输出UNDERFLOW,否则栈顶元素从栈中删除
void Pop(Stack *s){
if(IsEmpty(*s))
printf("UNDERFLOW");
else
s->Top--;
}
//返回栈顶元素值,若堆栈为空,则输出UNDERFLOW,否则在参数x中返回栈顶元素值
void StackTop(Stack s,T *x){
if(IsEmpty(s)) printf("UNDERFLOW");
else
*x=s.Elements[s.Top];
}
//输入一个整数
T* InputElement(){
printf("请输入一个整数:\n");
int a;
scanf("%d",&a);
return &a;
}
//输出栈内元素
void PrintStack(Stack s){
int i;
if(IsEmpty(s)){
printf("UNDERFLOW\n");
return;
}
for(i=0;i<=s.Top;i++)
printf("%5d",s.Elements[i]);
printf("\n");
}
int main()
{
Stack s;
T x;
T *a;
CreateStack(&s,10); //构造一个容量为10的空整数栈
Push(&s,10);Push(&s,15); //在栈中依次压入元素10和15
PrintStack(s); //显示栈中元素
a=InputElement(); //调用InputElement函数接受键盘输入并奖其赋给x
x=*a;
Push(&s,x); //将元素x进栈
PrintStack(s); //显示栈中元素
StackTop(s,a);
printf("%d\n",*a); //显示栈顶元素值
Pop(&s);Pop(&s); //在栈中依次弹出两个元素
if(IsEmpty(s)) //判断此时栈是否为空栈
printf("Is empty!\n");
else
printf("Is not empty!\n");
PrintStack(s); //显示栈中元素
return 0;
}
还可以求栈的长度,清除一个栈,遍历一个栈等,需要后续补充。