一、栈的定义:栈是只能在某一端插入或删除的特殊线性表。
二、基本操作:
- 进栈(PUSH)算法
- 退栈(POP)算法
三、例题:
1.例1:括号的匹配
分析:看到这一题,我们明显想到的,应该是统计左右括号的个数,然后判断,所以代码就出来了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char s[100001];
int main(){
int i,j,k,n,m;
int top=0;
gets(s);
for(i=0;i<strlen(s);i++){
if(s[i]=='(')top++;
if(s[i]==')'){
if(top)top--;
else{
printf("NO\n");return 0;
}
}
}
if(top){
printf("NO\n");return 0;
}
printf("YES\n");
return 0;
}
2.例2:变成求一个后缀表达式的值。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int a[100001];
char s[100001];
int main(){
int i,j,k,n,m,x=0,top=0;
gets(s);
for(i=0 ;i<strlen(s)-1;i++){
if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/'){
if(s[i]=='+'){
a[top-1]+=a[top];top--;
}
if(s[i]=='-'){
a[top-1]-=a[top];top--;
}
if(s[i]=='*'){
a[top-1]*=a[top];top--;
}
if(s[i]=='/'){
a[top-1]/=a[top];top--;
}
}
else if(s[i]==' '){
a[++top]=x;x=0;
}
else x=x*10+s[i]-'0';
}
printf("%d\n",a[1]);
return 0;
}
//样例:16 9 4 3 +*-@
3.例3:求一个算术表达式的值
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
using namespace std;
char s[1000001],c[1000001],zhan[1000001];
long long top,lenc,calc[1000001];
int bj(char a,char b){
if(a=='+')
if(b=='+' || b==')' || b=='-' || b=='@')return 1;
else return 0;
if(a=='-')
if(b=='+' || b==')' || b=='-' || b=='@')return 1;
else return 0;
if(a=='*')
if(b=='(')return 0;
else return 1;
if(a=='/')
if(b=='(')return 0;
else return 1;
if(a=='(')
if(b==')')return 2;
else return 0;
if(a==')')
if(b=='(')return 2;
else return 0;
if(a=='@')return 0;
}
void zhuanhuan(char s[]){
int i=0;
zhan[++top]='@';
while(i<strlen(s)){
if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/')
if(s[i-1]=='+' || s[i-1]=='*' || s[i-1]=='-' || s[i-1]=='/'){
printf("NO\n");exit(0);
}
if(s[i-1]>='0' && s[i-1]<='9' &&(s[i]<'0' || s[i]>'9'))c[lenc++]=' ';
if(s[i]>='0' && s[i]<='9')c[lenc++]=s[i];
else{
while(bj(zhan[top],s[i])==1 && top>1){
c[lenc++]=zhan[top--];
}
if(bj(zhan[top],s[i])==0)zhan[++top]=s[i];
else if(top>1)top--;
}
i++;
}
if(top>1){
while(top>1){
c[lenc++]=zhan[top];
top--;
}
}
}
long long jc(long long a,long long b){
long long sum=1;
for(long long i=1;i<=b;i++)
sum*=a;
return sum;
}
void cmp(){
long long i=0;
while(i<lenc){
if(c[i]=='+')calc[--top]=calc[top]+calc[top+1];
else if(c[i]=='-')calc[--top]=calc[top]-calc[top+1];
else if(c[i]=='*')calc[--top]=calc[top]*calc[top+1];
else if(c[i]=='/')calc[--top]=calc[top]/calc[top+1];
else{
top++;
long long x=0;
while(c[i]>='0' && c[i]<='9')x=x*10+c[i++]-'0';
calc[top]=x;if(i+1==lenc)i--;
}
i++;
}
}
int main(){
int i,j,k,n,m;
gets(s);
zhuanhuan(s);
top=0;
cmp();
printf("%lld\n",calc[1]);
return 0;
}
//样例:16-9*(4+3)
这是栈的一些简单例题,当然如果你想做一些更难的题目,可以访问各大题库。