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

栈的定义:

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

栈的性质:

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

栈的操作:

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


栈的操作


栈的表示:

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

#include

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<

cout<

cout<

print();

return 0;

}

void print()

{

for (int i=0;i

{

cout<

}

cout<

}

int pop()

{

int x;

if (TOP == -1)

{

  cout<<"栈已空"<

  return 0;

}

x=a[TOP-1];

TOP--;

    return x;

}

void push(int x)

{

  if (TOP == N)

  {

  cout<<"栈已满"<

  return ;

  }

  a[TOP] = x;

  TOP ++;

}

栈的应用:

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

#include

#include

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<<"表达式的值是:"<

return 0;

}

void jisuan(string ss)

{

for (int i=0;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<<"栈已空"<

  return 0;

}

x=a[TOP-1];

TOP--;

    return x;

}

void push(int x)

{

  if (TOP == N)

  {

  cout<<"栈已满"<

  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

你可能感兴趣的:(信息学奥赛系列教程:数据结构栈及应用)