堆栈
定义
有操作约束的线性表,只在栈顶插入(入栈push)和删除(出栈pop) 特点:后入先出
中缀表达式转后缀表达式
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
ABCD/-E*-
A输出 ,-入栈 , (入栈 ,B输出 ,-入栈, C输出, /入栈,D输出,)开始出栈 / - ,*入栈,E输出,最后输出栈中 * -
所以过程中堆栈有大小4
栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
#define MaxSize<储存数据元素的最大个数>
typedef struct SNode *Stack;
struct SNode{
ElementType Data[MaxSize];
int Top;
};
1.入栈
void Push( Stack PtrS,ElementType item )
{
if ( PtrS->Top == MaxSize-1 ) { //从0开始 空栈为-1
printf(“堆栈满”);
return;
}else {
PtrS->Data[++(PtrS->Top)] = item;
return;
}
}
2.出栈
ElementType Pop( Stack PtrS )
{
if ( PtrS->Top ==-1 ){
printf(“堆栈空");
return ERROR;
/*ERROR是ElementType的特殊值,标志错误
*/
}else
return ( PtrS->Data[(PtrS->Top)--]);
}
一个数组实现两个堆栈
从两头开始往中间堆
#define MaxSize<存储数据元素的最大个数>
struct DStack {
ElementType Data[MaxSize];
int Top1;
/*堆栈1的栈顶指针*/
int Top2;
/*堆栈2的栈顶指针*/
}S;
S.Top1 = -1;
S.Top2 =MaxSize;
void Push( struct Dstack *PtrS,ElementType item,int rag ){/* Tag作为区分两个堆栈的标志,取值为1和2*/
if ( PtrS->Top2 - Ptrs->Top1 == 1){//堆栈满了//
printf("堆栈满"); return ;
}
if (Tag == 1 )/*对第一个堆栈操作*/
Ptrs->Data[++(PtrS->Top1) ]= item;
else
/对第二个堆栈操作* /
Ptrs->Data[--(PtrS->Top2)]= item;
}
// push的++ --都在前面
ElementType Pop ( struct Dstack *Ptrs, int rag ){/* Tag作为区分两个堆栈的标志,取值为1和2 */
if ( Tag == 1 ) {/*对第一个堆栈操作*/
if ( PtrS->Top1 == -1 ){/*堆栈1空*/
printf( 堆栈1空");return NULL;
} else return PtrS->Data[ (Ptrs->Top1)--];
}else {
/对第二个堆栈操作* /
if (Ptrs->Top2 --Maxsize ) {/*堆栈2空*/
printf("堆栈2空"); return NULL;
}else return Ptrs->Data[ (Ptrs->Top2)++];
}
}
//pop ++ --在后
堆栈的链式存储实现
一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。
top在链表头上
1.堆栈初始化(建立空栈)
2.判断堆栈s是否为空
stack Createstack ()
{/*构建一个堆栈的头结点,返回指针*/
stack s ;
s =(stack) mal1oc(sizeof (struct sNode)) ;
S->Next = NULL;
return s ;
}
int IsEmpty (stack s)
{ /*判断堆栈s是否为空,若为空函数返回整数1,否则返回0*/
return (s->Next -NULL);
}
//入栈
void Push (ElementType item, stack s)
{/*将元素item压入堆栈s*/
struct sNode*Tmpcel1;
TmpCell=(struct SNode *)malloc(sizeof(struct sNode)) ;
TmpCell->Element = item;
Tmpcell->Next - S->Next;
s->Next = TmpCell;
}
//入栈
lementType Pop (stack s)
{/*删除并返回堆栈s的栈顶元素*/
struct SNode *Firstcel1;
ElementType TopElem ;
if(IsEmpty ( s )){
printf(“堆栈空"); return NULL;
}else {
Firstcell = S->Next;
s->Next = Firstce11->Next;
TopElem = Firstcell ->Element;
free (Firstce11) ;//释放空间
return TopElem ;
}