栈的基本操作
//基本数据结构
typedef struct {
ElemTp *elem;
int n;
int top;
}
//创建栈
int creatStack(SqStack &s,int n){
if(n<=0)return 0;
s.elem=newElemTp[n];
s.n=n;
s.top=-1;
if(!s.elem)return 0;
else return 1;
}
//摧毁栈
void distroyStack(&SqStack &s)
{
delete []s.elem;
s.n=0;
s.top=-1;
}
//出栈
int pop(SqStack &s,ElemTp &e)
{
if(s.top==-1) return 0;
e=s.elem[top--];
return 1;
}
//入栈
int push(SqStack &s,int t)
{
if(s.top>=s.n-1) return 0;
s.elem[++s.top]=t;
return 1;
}
//判断是否为空栈
int empty(SqStack &s)
{
if(s.top==-1) return 1;
else return 0;
}
//判断是否栈满
int full(SqStack &s)
{
return s.top>=s.n-1;
}
栈的应用
中缀式:
a+b*5/(3-c)
前缀式:
+ a / * b 5 - 3 c
后缀式:
a b 5 * 3 c - / +
中缀式变换为前缀式与后缀式的手工方法 a. 对中缀表达式加完全括号; b. 将每个运算符移动到本层次括号之前(之后); c. 去掉所有括号,即得前(后)缀表达式。
栈习题练习
Fibnacci数列用栈实现
。。代码有问题,但是不知道哪里错了,😵
#include <iostream>
#include<iomanip>
using namespace std;
typedef struct{
int r1;
int r2;
int n;
}ElemTp;
int fib(int n)
{
ElemTp *s=new ElemTp[n];
int top=-1;
ElemTp a={n,-1,-1};
s[++top]=a;
int r;
while(1)
if(s[top].r1!=-1&&s[top].r2!=-1)
{
r=s[top].r1+s[top].r2;
--top;
if(top==-1)break;
if(s[top].r1==-1) s[top].r1=r;
else s[top].r2=r;
}
else
if(s[top].n<=1) {s[top].r1=1;s[top].r2=0;}//入栈{n-1,1,0}
else{
a.n=s[top].n-1;//入栈n-1
a.r1=-1;a.r2=-1;
if(s[top].r1!=-1)
a.n--;//入栈n-2
s[++top]=a;
}
delete []s;
return r;
}
int main()
{
int i;
for(i=0;i<20;i++)
{
cout<<setw(12)<<fib(i);
if(i%5==4) cout<<endl;
}
return 0;
}