栈的定义:
栈是只能在一端进行数据插入和删除的线性表。
栈的性质:
后进先出(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