美文网首页
信息学奥赛系列教程:数据结构栈及应用

信息学奥赛系列教程:数据结构栈及应用

作者: noipbar | 来源:发表于2018-11-21 19:28 被阅读0次

    栈的定义:

         栈是只能在一端进行数据插入和删除的线性表。

    栈的性质:

         后进先出(FILO),后面进去的元素,先出来,先进去的元素后出来

    栈的操作:

         栈的操作很简单,就是入栈和出栈,如下图所示

    栈的操作


    栈的表示:

    用一个一维数组,加一个指针,表示栈,代码如下:

    #include <iostream>

    using namespace std;

    const int N =10;//定义栈的长度

    int a[N];      //定义栈(数组)

    int TOP =0;    //定义栈的指针

    void push(int x);  //入栈

    int pop();        //出栈

    void print();    //栈元素输出

    int main()

    {

        for (int i=1;i<=11;i++)

        {

        push(i);

        }

        print();

        cout<<pop()<<endl;

    cout<<pop()<<endl;

    cout<<pop()<<endl;

    print();

    return 0;

    }

    void print()

    {

    for (int i=0;i<TOP;i++)

    {

    cout<<a[i]<<" ";

    }

    cout<<endl;

    }

    int pop()

    {

    int x;

    if (TOP == -1)

    {

      cout<<"栈已空"<<endl;

      return 0;

    }

    x=a[TOP-1];

    TOP--;

        return x;

    }

    void push(int x)

    {

      if (TOP == N)

      {

      cout<<"栈已满"<<endl;

      return ;

      }

      a[TOP] = x;

      TOP ++;

    }

    栈的应用:

    求前缀、后缀表达式的值,有关前缀、后缀表达式,在后面二叉树时介绍,应用代码如下:

    #include <iostream>

    #include <cstring>

    using namespace std;

    const int N =255;//定义栈的长度

    int a[N];      //定义栈(数组)

    int TOP =0;    //定义栈的指针

    void push(int x);  //入栈

    int pop();        //出栈

    void jisuan(string ss);

    int main()

    {

    string ss="34+5*6-";  //34+5*6-

    jisuan(ss);

    cout<<"表达式的值是:"<<pop()<<endl;

    return 0;

    }

    void jisuan(string ss)

    {

    for (int i=0;i<ss.length();i++)

    {

    int x=0,y=0;

    if (ss[i] == '+')

    {

    x=pop();

    y=pop();

    push(x+y);

    continue;

    }

    if (ss[i] == '-')

    {

    x=pop();

    y=pop();

    push(x-y);

    continue;

    }

    if (ss[i] == '*')

    {

    x=pop();

    y=pop();

    push(x*y);

    continue;

    }

    if (ss[i] == '/')

    {

    x=pop();

    y=pop();

    push(x/y);

    continue;

    }

    push(ss[i]-48);

    }

    }

    int pop()

    {

    int x;

    if (TOP == -1)

    {

      cout<<"栈已空"<<endl;

      return 0;

    }

    x=a[TOP-1];

    TOP--;

        return x;

    }

    void push(int x)

    {

      if (TOP == N)

      {

      cout<<"栈已满"<<endl;

      return ;

      }

      a[TOP] = x;

      TOP ++;

    }

    栈相关题目:

    在信息学奥赛中,有关栈的知识考查,主要以选择题居多,考查栈的基本概念和操作

    如下面的题目:

         某个车站呈狭长型,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从这一时刻开始的出入记录为“进,出,进,进,进,出,出,进,进,进,出,出”,假设车辆入站的顺序为1,2,3,..则车辆的出站顺序为()

    A.1,2,3,4,5     B.1,2,4,5,7 C.1,4,3,7,6  D.1,4,3,7,2

    相关文章

      网友评论

          本文标题:信息学奥赛系列教程:数据结构栈及应用

          本文链接:https://www.haomeiwen.com/subject/omqhqqtx.html