栈的定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶(top),相对地,把另一端称为栈底(bottom)。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
- 信息学中的栈一般是数组来实现,stl库中内置有栈这个容器。不过信息学竞赛中一般都是自己实现。
基本算法
1、进栈(push)
①若top≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②top++(栈指针加1,指向进栈地址);
③s[top]=x,结束(X为新进栈的元素);
代码:
void push(int x)//进栈
{
s[++top]=x;
}
当然,像上文所说,你还可以这么写:
stack<int> s;
s.push(x);
2、出栈(pop)
①若top≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②x=s[top],(退栈后的元素赋给x):
③top- -,结束(栈指针减1,指向栈顶)。
代码:
void pop()//出栈
{
return s[top--];
}
同样:
stack<int> s;
s.pop(x);
例题
只讲一道
计算表达式的值
【题目描述】
小明在你的帮助下,破译了Ferrari设的密码门,正要往前走,突然又出现了一个密码门。
门上有一个算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”,求出的值就是密码。
小明的数学学得不好,还需你帮他的忙。(“/”用整数除法)
【输入格式】
只有一行是一个算式(算式长度<=30)。
【输出格式】
对于每组数据,输出算式的值(所有数据在2^31-1内)。
【样例输入】
1+(3+2)*(7^2+6*9)/(2)
【样例输入】
258
【代码】