stack堆栈的讲解
栈的定义及特点
堆是一个很神奇的概念,但这里并不用想得太麻烦,想像一个羽毛球桶,只有一个开口,只能从瓶口放进羽毛球或者从瓶口把【最上面】的羽毛球拿出来。也就是 stack 堆栈是一个【后进先出(Last In First Out,LIFO)】(先进后出)的数据存储结构。元素只能从栈顶入栈,只能从栈顶出栈,只能读取栈顶元素。
stack 堆栈容器的声明
需要头文件
#include
stack<T> s; // T 是容器内元素的变量类型
stack 堆栈容器的常用方法
s.push(e); //从栈顶将元素入栈,即是插入
s.pop(); //将栈顶元素出栈,即是删除
s.top(); //读取栈顶元素,此时栈顶元素仍然存在
s.empty(); //判断队列是否为空,空即是true
stack 堆栈容器的操作和遍历
#include <iostream>
#include <stack>
using namespace std;
int main() {
//定义一个空栈
stack<int> s;
//从栈顶入栈 3 个元素
s.push(0);
s.push(1);
s.push(2);
//读取栈顶元素
cout << s.top() << endl;
//将站定出战
s.pop();
cout << s.top() << endl;
return 0;
}
2
1
栈的输出方式
对于一个栈,给出输入项A、B、C,如果输入项序列
由ABC组成,试给出所有可能的输出序列。
栈状态 产生式
A进 A出 B进 B出 C进 C出 ABC
A进 A出 B进 C进 C出 B出 ACB
A进 B进 B出 A出 C进 C出 BAC
A进 B进 B出 C进 C出 A出 BCA
A进 B进 C进 C出 B出 A出 CBA
不可能产生输出序列CAB
例题
已知一个栈的进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=n,则pi的值 。
(A) i (B) n-i
(C) n-i+1 (D) 不确定
答案选C。
s.base=s.top 表示空栈;
s.base=NULL 表示栈不存在;
栈的基本操作和实现
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType data[MaxSize+1];
int top; //栈顶指针
int bottom; //栈底指针
}Stack, *pStack;
/**********************************************************/
//初始化顺序栈
Status InitStack(pStack S)
{
S->top = S->bottom = 0;
return OK;
}
/**********************************************************/
//压栈操作
Status Push_Stack(pStack S, ElemType e)
{
if (MaxSize == S->top)
return ERROR;
S->data[++S->top] = e;
++S->data[0];
return OK;
}
/**********************************************************/
//输出顺序栈中所有元素
void DispStack(pStack S)
{
int i=1;
while (i<=S->top)
{
printf("%d ", S->data[i]);
++i;
}
}
/**********************************************************/
//出栈
Status Pop_Stack(pStack S, ElemType *e)
{
if (S->bottom == S->top)
return ERROR;
*e = S->data[S->top--];
return OK;
}
/**********************************************************/
int main(void)
{
Stack S;
int e;
InitStack(&S);
if (!Pop_Stack(&S, &e))
printf("栈空");
else
printf("\n\n%d", e);
return 0;
}
栈的应用
能够解决的问题:
(1)数制转换
(2)括号匹配的检验
(3)行编辑程序问题
(4)表达式求值
(5)迷宫求解
(6)实现递归
多加练习,方能熟练掌握栈的用法。