0.PTA得分截图
1.本周学习总结
1.1 总结栈和队列内容
1.栈的存储结构及操作
1.栈
1.栈(stack):是限定仅在表尾进行插入和删除操作的线性表。其中,允许插入和删除的一端被称为栈顶(top),另一端被称为栈底(bottom),不含任何数据元素的栈被称为空栈。栈又被称为后进先出(Last In First Out)的线性表,简称LIFO结构。
栈的插入操作为进栈,栈的删除操作为出栈。
2.栈的抽象数据类型
ADT 栈(stack)
Data
同线性表。元素具有相同类型,相邻元素具有前驱和后继关系。
Operation
InitStack(S):初始化操作,建立一个空栈S。
DestoryStack(S):若栈存在,则销毁它。
ClearStack(S):将栈清空。
StackEmpty(S):若栈为空,返回true,否则返回false。
GetTop(S,e):若栈存在且非空,用e返回S的栈顶元素。
Push(S,e):若栈S存在,插入新元素e到栈S中并称为栈顶元素
Pop(S,*e):删除栈S中栈顶元素,并用e返回其值
StackLength(S):返回栈S的元素个数
endADT
2.栈的存储结构
(1)栈顺序结构定义
#define OK 1
#define ERROR 0
typedef int SElemType; //SElemType类型根据实际情况而定,这里假设为int
typedef struct
{
SElemType data[MAXSIZE]; //栈存储空间大小MAXSIZE
int top; //用于栈顶指针
}SqStack;
(2)共享栈
3.栈的顺序存储结构
栈类型SqStack:
typedef struct
{ ElemType data[MaxSize];
int top; //栈顶指针
} Stack;
typedef Stack *SqStack;
顺序栈4要素:
栈空条件:top=-1
栈满条件:top=MaxSize-1
进栈e操作:top++; st->data[top]=e
退栈操作:e=st->data[top]; top--;
顺序栈中实现栈的基本运算算法
(1)初始化栈initStack(&s)
void InitStack(SqStack &s)
{ s=new Stack;
s->top=-1;
}
(2)销毁栈ClearStack(&s)
void DestroyStack(SqStack &s)
{
delete s;
}
(3)判断栈是否为空StackEmpty(s)
bool StackEmpty(SqStack s)
{
return(s->top==-1);
}
(4)进栈操作(从栈顶插入一个元素)
算法思路:
a.判定是否栈满;
b.栈顶加1;
c.将元素插入到
实现:插入元素e为新的栈顶元素
Status Push(SqStack *S,SElemType e)
{
if(S->top==MAXSIZE-1) //栈顶=MAXSIZE-1,即数组的最后一个存储位置,说明栈满
{
return ERROR;
}
S->top++; //栈顶加1
S->data[S->top]=e; //将元素入栈
return OK;
}
(5)出栈操作(从栈顶删除一个元素)
算法思路:
a.判定栈是否为空;
b.将栈顶元素保存到指针变量e所指向的存储位置中;
c.栈顶减1.
实现:若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==-1) //空栈
{
return ERROR;
}
*e=S->data[S->top];
S->top--;
return OK;
}
(6)取栈顶元素GetTop(s)
在栈不为空的条件下,将栈顶元素赋给e。
bool GetTop(SqStack *s,ElemType &e)
{
if (s->top==-1) //栈为空的情况
return false;
e=s->data[s->top];
return true;
}
2.栈的应用
------------恢复内容开始------------
0.PTA得分截图
1.本周学习总结
1.1 总结栈和队列内容
1.栈的存储结构及操作
1.栈
1.栈(stack):是限定仅在表尾进行插入和删除操作的线性表。其中,允许插入和删除的一端被称为栈顶(top),另一端被称为栈底(bottom),不含任何数据元素的栈被称为空栈。栈又被称为后进先出(Last In First Out)的线性表,简称LIFO结构。
栈的插入操作为进栈,栈的删除操作为出栈。
2.栈的抽象数据类型
ADT 栈(stack)
Data
同线性表。元素具有相同类型,相邻元素具有前驱和后继关系。
Operation
InitStack(S):初始化操作,建立一个空栈S。
DestoryStack(S):若栈存在,则销毁它。
ClearStack(S):将栈清空。
StackEmpty(S):若栈为空,返回true,否则返回false。
GetTop(S,e):若栈存在且非空,用e返回S的栈顶元素。
Push(S,e):若栈S存在,插入新元素e到栈S中并称为栈顶元素
Pop(S,*e):删除栈S中栈顶元素,并用e返回其值
StackLength(S):返回栈S的元素个数
endADT
2.栈的存储结构
1.栈的顺序存储结构
栈类型SqStack:
typedef struct
{ ElemType data[MaxSize];
int top; //栈顶指针
} Stack;
typedef Stack *SqStack;
顺序栈4要素:
栈空条件:top=-1
栈满条件:top=MaxSize-1
进栈e操作:top++; st->data[top]=e
退栈操作:e=st->data[top]; top--;
顺序栈中实现栈的基本运算算法
(1)初始化栈initStack(&s)
void InitStack(SqStack &s)
{ s=new Stack;
s->top=-1;
}
(2)销毁栈ClearStack(&s)
void DestroyStack(SqStack &s)
{
delete s;
}
(3)判断栈是否为空StackEmpty(s)
bool StackEmpty(SqStack s)
{
return(s->top==-1);
}
(4)进栈操作(从栈顶插入一个元素)
算法思路:
a.判定是否栈满;
b.栈顶加1;
c.将元素插入到
实现:插入元素e为新的栈顶元素
Status Push(SqStack *S,SElemType e)
{
if(S->top==MAXSIZE-1) //栈顶=MAXSIZE-1,即数组的最后一个存储位置,说明栈满
{
return ERROR;
}
S->top++; //栈顶加1
S->data[S->top]=e; //将元素入栈
return OK;
}
(5)出栈操作(从栈顶删除一个元素)
算法思路:
a.判定栈是否为空;
b.将栈顶元素保存到指针变量e所指向的存储位置中;
c.栈顶减1.
实现:若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==-1) //空栈
{
return ERROR;
}
*e=S->data[S->top];
S->top--;
return OK;
}
(6)取栈顶元素GetTop(s)
在栈不为空的条件下,将栈顶元素赋给e。
bool GetTop(SqStack *s,ElemType &e)
{
if (s->top==-1) //栈为空的情况
return false;
e=s->data[s->top];
return true;
}
2.栈链式存储结构
定义:
typedef int ElemType;
typedef struct linknode
{ ElemType data; //数据域
struct linknode *next; //指针域
} LiNode,*LiStack;
链栈中实现栈的基本运算算法:
(1)初始化栈initStack(&s)
void InitStack(LiStack &s)
{ s=new LiNode;
s->next=NULL;
}
(2)销毁栈ClearStack(&s)
释放栈s占用的全部存储空间。同链表删除:
void DestroyStack(LiStack &s)
{ LiStack p;
while (s!=NULL)
{ p=s;
s=s->next;
free(p);
}
}
3)判断栈是否为空StackEmpty(s)
栈S为空的条件是s->next==NULL,同空链表
bool StackEmpty(LiStack s)
{
return(s->next==NULL);
}
(4)进栈Push(&s,e)
将新数据节点插入到头节点之后。对应算法如下:
void Push(LiStack &s,ElemType e)
{ LiStack p;
p=new LiNode;
p->data=e; //新建元素e对应的节点*p
p->next=s->next; //插入*p节点作为开始节点
s->next=p;
}
(5)出栈Pop(&s,&e)
在栈不为空的条件下,将头节点后继数据节点的数据域赋给e
bool Pop(LiStack &s,ElemType &e)
{ LiStack p;
if (s->next==NULL) //栈空的情况
return false;
p=s->next; //p指向开始节点
e=p->data;
s->next=p->next; //删除*p节点
free(p); //释放*p节点
return true;
}
6)取栈顶元素GetTop(s,e)
在栈不为空的条件下,将头节点后继数据节点的数据域赋给e。
bool GetTop(LiStack s,ElemType &e)
{ if (s->next==NULL) //栈空的情况
return false;
e=s->next->data;
return true;
}
stack容器:
#include<stack>
1.stack<int> s:初始化栈,参数表示元素类型
2.s.push(t):入栈元素t
3.s.top():返回栈顶元素
4.s.pop():出栈操作只是删除栈顶元素,并不返回该元素。
5.s1.empty(),当栈空时,返回true。
6.s1.size():访问栈中的元素个数
2.栈的应用
表达式求值
中缀转后缀表达式
中缀表达式:运算符号位于两个运算数之间。如 ,a + b *c - d / e
后缀表达式:运算符号位于两个运算数之后。如, a b c *+ d e /-
exp:字符数组
a + b * c - d / e * f