堆栈的初识

堆栈(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;
}

还可以求栈的长度,清除一个栈,遍历一个栈等,需要后续补充。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值