栈的定义:栈是一种只能在一端进行插入或删除操作的线性表。
栈的一些概念:1.允许进行插入、删除操作的一端称为栈顶。
2.表的另一端称为栈底。
3.当栈中没有数据元素时,称为空栈。
4.栈的插入操作通常称为进栈或入栈。
5.栈的删除操作通常称为退栈或出栈。
栈的主要特点:先入先出(FIFO).
栈中元素逻辑关系与线性表的相同,栈可以采用与线性表相同的存储结构,即可以使用顺序栈,也可以使用链栈.
顺序栈:
1.栈的结构定义:
typedef struct{
int data[MAXSIZE];
int top; //栈顶指针
}SqStack;
顺序栈的四要素:1.栈空条件:top = -1
2.栈满条件:top=MaxSize-1
3.进栈e操作:top++ 将e放在top处
总结: 1.约定top总是指向栈顶元素,初始值为-1.
2. 当top=MaxSize-1时不能再进栈-栈满
3.进栈时top增1,出栈时top减1
4.退栈操作:从top处取出元素e, top--;
栈的操作:
1.栈的初始化:
void InitStack(SqStack* &s)
{
s = (SqStack*)malloc(sizeof(SqStacks));
s->top = -1;
}
2.销毁栈
void DestroyStack(SqStack* &s)
{
free(s);
}
3.判断栈是否为空
bool isEmpty(SqStack*s)
{
return (s->top == 1)
}
4.进栈Push
bool Push(SqStack* &s,int ele)
{
//先判断栈是否已经满了
if(s->top == MAXSIZE-1)
return false;
s->top++;
s->data[s->top] = ele;
return true;
}
5.出栈Pop
bool pop(SqStack* &s,int &ele)
{
if(s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}
6.取栈顶元素
bool getTop(SqStack* &s,int &ele)
{
if(s->top == -1)
return false;
e = s->data[s->top];
return true;
}
栈的算法设计例题:设计一个算法利用顺序栈判断一个字符串是否是对 称串。所谓对称串是指从左向右读和从右向左读的序列相同。
算法设计思路:字符串str的所有元素依次进栈,产生的出栈序列正好与str的顺序相同,则是对称串
算法代码:
bool isSummetry(char str[])
{
int i;
char e;
SqStack* s;
for(i = 0;str[i] != '\0';i++)
Push(s,str[i]); //依次进栈
for(i = 0;str[i] != '\0';i++)
{
Pop(s,e);
if(str[i] != e)
{
DestoryStack(s);
return false;
}
}
DestoryStack(s);
return true;
}
链栈:
1.链栈的定义
typedef struct linknode
{
int data;
struct linknode *next;
} LiStack;
2.栈的初始化
void (LiStack *&s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}
3.判断栈是否为空
bool isEmpty(LiStack *s)
{
return(s->next==NULL);
}
4.Push
//头插法
void Push(LiStack *&s,ElemType e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}
5.Pop
bool Pop(LiStack *&s,ElemType &e)
{
LiStack *p;
if (s->next==NULL)
return false;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
6.取栈顶元素
bool GetTop(LiStack *s,ElemType &e)
{
if (s->next==NULL) //栈空的情况
return false;
e=s->next->data;
return true;
}
链栈算法设计:编写一个算法判断输入的表达式中括号是否配 对(假设只含有左、右圆括号).
bool Match(char exp[],int n)
{
int i=0;
char e;
bool match = true;
LiStack *st;
InitStack(st); //初始化栈
while (i<n && match) //扫描exp中所有字符
{
if (exp[i]=='(')
Push(st, exp[i]);
else if(exp[i]==')')
{
if (GetTop(st,e)==true)
{
if (e!='(')
match=false;
else
Pop(st,e);
}
else
match=false;
}
}
i++;
if (!StackEmpty(st))
match=false;
DestroyStack(st);
return match;
}