栈概念

栈是一个有用的数据结构,它就像摞在一起的盘子。
在这里插入图片描述

  1. 可以放一个新盘子到顶部
  2. 从顶部移除一个盘子
    如果放盘子到底部,必须首先移除所有盘子,这种方法叫做Last In First Out,最后放的盘子要首先移除。

在编程中的栈

在编程中,放一个元素叫做push,移除一个元素叫做pop。
在这里插入图片描述
尽管2最后放进去,但是首先移除,遵循LIFO原则。
尽管可以使用C,C++,Java,Python,C#实现栈,但是原理都是相同的。

栈操作

栈是一个对象或者是一个抽象数据结构(ADT),允许下面的操作:

  1. push:添加元素到栈
  2. pop:从栈中移除元素
  3. IsEmpty:检查栈是否为空
  4. IsFull:检查栈是否满
  5. Peek:得到栈的顶部元素,但是不移除

栈工作原理

  1. 一个TOP的指针指向栈的顶部元素
  2. 当初始化栈时,设置TOP的值为-1,检测栈是否为空(TOP == -1)
  3. 当添加元素后,我们增加TOP的值,TOP指向新元素的位置
  4. 当移除元素时,返回TOP指向元素的值,并减少TOP的值
  5. 在push之前,首先检测栈是否满
  6. 在pop之前,首先检测栈是否空

在这里插入图片描述

实现栈

大部分栈使用arrays实现,但是也可以使用lists实现。
C语言实现

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 10
struct stack
{
    int items[MAX];
    int top;
};
typedef struct stack st;
void createEmptyStack(st *s)
{
    s->top=-1;
}
int isfull(st *s)
{
    if (s->top==MAX-1)
        return 1;
    else
        return 0;
}
int isempty(st *s)
{
    if (s->top==-1)
        return 1;
    else
        return 0;
}
void push(st *s)
{
    int newitem;
    printf("Enter item to be inserted: ");
    scanf("%d",&newitem);
    if (isfull(s))
    {
        printf("STACK FULL");
    }
    else
    {
        s->top++;
        s->items[s->top]=newitem;
    }
}
void pop (st *s)
{
    if (isempty(s))
    {
        printf("\n STACK EMPTY \n");
    }
    else
    {
        printf("Item popped= %d",s->items[s->top]);
        s->top--;
    }
}
void main()
{
    int ch;
    int loop;
    loop=1;
    st *s;
    createEmptyStack(s);
    do
    {
        printf("\n ***STACK OPERATIONS");
        printf("\n 1. PUSH");
        printf("\n 2. POP");
        printf("\n 3. EXIT");
        printf("\n ***************");
        printf("\n Enter your choice: ");
        scanf("%d", &ch);
        switch (ch)
        {
            case 1: 
                push(s);
                break;
            case 2:
                pop(s);
                break;
            case 3:
                printf("THANK YOU");
                loop=0;
                exit(0);
            default:
                printf("Invalid choice");
        }
    } while(loop);
    getch();
}

栈的使用

  1. 反转单词
  2. 编译器通过转换表达式为prefix或者postfix形式来计算表达式的值
  3. 浏览器中的返回按钮
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值