【栈】

 

1.什么是栈

 

有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择顺序存储来讲

作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model:

这就是一个栈,相信你或多或少也了解一些栈的知识,当然如果不了解或者不知道你涉及过那还是继续看吧

栈数据结构是后进先出(Last  In First Out,简称LIFO),何谓后进先出?你可以把栈视作一个有下底的盒子,然后你把各种书放进去,如果你想拿书,你拿到的第一步一定是你最后放进去的,这就是栈

栈是一种只能在一端进行插入或者删除操作的线性表(说明栈还是线性表结构,只是操作受限而已)。其中允许进行插入或者删除操作的一端称为栈顶。栈的插入和删除一般叫入栈和出栈。栈的顺序存储结构叫做顺序栈,栈的链式存储结构叫做链栈。

 

2.栈的特点

 

栈的特点是后进先出。老师都喜欢举那个将盘子压入箱子的例子来解释栈的特点。举个例子:很多车开进死胡同,先进去的必须得等之前所有的车全出去才可以出去,所以第一个进去的车最后一个出来。最后进去的车第一个出来,所以这个就类似于栈,先进后出。

 

3.栈基本操作

  1. bool is_full(): 判断堆栈 S 是否已满;
  2. void push(element_type item): 将元素 item 压入堆栈;
  3. bool is_empty(): 判断堆栈 S 是否为空;
  4. element_type pop(stack s): 删除并返回栈顶元素;

C 语言: 实现顺序栈,使用数组来实现,只能存储int数据(stack)。

#include <stdio.h>
 
 /**
 * C 语言: 实现顺序栈,使用数组来实现,只能存储int数据(stack)。
 *
 * @author llz
 * @date 2018/7/02
 */
 
//Sequence Stack 

int stack[500];

//栈顶下标 
int top;



void init()
{
    top=-1;
}
 
//判断栈是否为空
bool Empty()
{
    if(top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 
//判断栈是否已满了
bool full()
{
    if(top==500-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 
//入栈
void Push(int element)
{
    if(!full())
    {
        top++;
        stack[top]=element;
    }
    else
    {
        printf("栈满\n");
    }
}
 
//出栈
void Pop()
{
    if(!Empty())
    {
        top--;
    }
    else
    {
        printf("栈空\n");
    }
}
 
//取栈顶元素
int getTop()
{
    if(!Empty())
    {
        return stack[top];
    }
    else
    {
        printf("栈空\n");
    }
}
 

int main()
{
    int i=0;
  
    //初始化栈
    printf("\n###########init###########\n");
    init();
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########push(0~10))###########\n");
    for(i=0;i<=10;i++)
    {
        Push(i);
    }
    printf("----------------------------------");
    printf("\n###########gettop###########\n");
    printf("%d\n",getTop());
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########pop###########\n");
    
        Pop();
 
    printf("----------------------------------");    
    printf("\n###########gettop###########\n");
    printf("%d\n",getTop());
    printf("----------------------------------");
       printf("\n###########push(12)###########\n");
    Push(12);
    
    printf("%d\n",getTop());
}

 

4.栈练习

第1题

设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6一次通过栈S,一个元素出栈后即进队列Q,若6个元素出栈的序列是e2,e4,e3,e6,e5,e1则栈的S的容量之多应该是()

A. 6 B. 4 C. 3 D. 2

第2题

若已知一个栈的入栈顺序是1、2、3、4.其出栈序列为P1、P2、P3、P4、,则P2、P4不可能是()

A. 2、4 B. 2、 1 C. 4 、 3 D. 3 、 4

 

第3题

一个栈的入栈序列为A B C D E 则不可能的输出序列为(C)

 

1.  EDCBA

2.  DECBA 

3.  DCEAB 

4.  ABCDE

posted @ 2018-07-02 23:42  LizLiz  阅读(145)  评论(0)    收藏  举报