数据结构-链栈的基础操作

栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。
在这里插入图片描述

  • 链式栈无栈满问题,空间可扩充
  • 插入与删除仅在栈顶处执行
  • 链式栈的栈顶在链头
  • 适合于多栈操作

/* 链栈结构 */


typedef struct StackNode  
{  
       SElemType data;  //节点数据域
       struct StackNode *next;   //节点指针域  
} StackNode,*LinkStackPtr;   //节点指针
  
typedef struct LinkStack  
{  
       LinkStackPtr top;    //栈顶指针
       int count;               //栈中元素个数
}LinkStack; 

//栈的初始化操作

Status InitStack(LinkStack &S)  
{   
    	S.top = (LinkStackPtr)malloc(sizeof(StackNode));  
    	if(!S.top)   
        		return ERROR;      	
	S.top->next = NULL;  
    	S.count = 0;  
    	return OK;  
} 

/* 把S置为空栈 */

Status ClearStack(LinkStack &S)  
{   
   	LinkStackPtr  p, q;  
    	p = S.top->next;  
   	 while(p)  
    	{    
        		q = p; 
        		p = p->next;  
        		free(q);  
    	}   
    	S.count=0;  
  
    	return OK;  
}  

/* 若栈S为空栈,则返回TRUE,否则返回FALSE */

Status IsEmptyStack(LinkStack S)  
{   
    if (S.count == 0)  
    { 
        return TRUE; 
    } 
    else  
    { 
        return FALSE; 
    } 
}  

/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */

Status GetTopElem(LinkStack S,SElemType *e)  
{  
    if (S.top->next == NULL)  
    {  
        return ERROR;  
    }  
    else  
    {  
        *e = S.top->next->data;  
    }  
    return OK;  
} 

/* 压栈 */

Status Push(LinkStack &S, SElemType e)  
{  
    LinkStackPtr p=(LinkStackPtr)malloc(sizeof(StackNode));  
    if (!s)  
    {  
        return ERROR;  
    }  
    p->data = e;  
    p->next = S.top->next ; 
    S.top->next  = p;        
    S.count++;  
  
    return OK;  
} 

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */

Status Pop(LinkStack &S,SElemType &e)  
{   
    LinkStackPtr p;  
    if(IsEmptyStack(S))  
    {  
        return ERROR;  
    }  
    p = S.top->next; 
    e = p->data;   
    S.top->next = p->next;
    free(p);                 
    S.count--;  
    return OK;  
}  

附录:完整代码调试

#include <iostream>
using namespace std;

typedef int SElemType;
typedef int Status;

typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
} StackNode, *LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

Status InitStack(LinkStack &S)
{
    S.top=(LinkStackPtr)malloc(sizeof(StackNode));
    if(!S.top) return -1;
    S.top->next=NULL;
    S.count=0;
    return 1;
}
Status ClearStack(LinkStack &S)
{
    LinkStackPtr p,q;
    p = S.top->next;
    while(p)
    {
        q=p;
        p=p->next;
        S.top->next=p;
        free(q);
    }
    S.count=0;  //
    return 1;
}
bool IsEmptyStack(LinkStack S)
{
    if(S.top->next==NULL) return true;
    return false;
}
Status GetTopElem(LinkStack S,SElemType *e)
{
    LinkStackPtr p;
    p=S.top->next;
    if(!p) *e=0;
    else *e=p->data;   //  *e
    return 1;
}
Status Push(LinkStack &S,SElemType e)   //如果是*S 的话下面要用S->top->next
{
    LinkStackPtr P;
    P=(LinkStackPtr)malloc(sizeof(StackNode));
    P->data=e;
    P->next=S.top->next;
    S.top->next=P;
    S.count++; //
    return 1;
}
Status Pop(LinkStack &S,SElemType &e)
{
    LinkStackPtr p;
    if(IsEmptyStack(S)) return 0;
    p = S.top->next;
    e=p->data;
    S.top->next=p->next;
    free(p); //
    S.count--;
    return e;
}
void menu()
{
    cout<<"初始化栈:0"<<endl;
    cout<<"入栈:1"<<endl;
    cout<<"出栈:2"<<endl;
    cout<<"取栈顶元素:3"<<endl;
    cout<<"清空栈:4"<<endl;
    cout<<"退出:5"<<endl;
}
int main()
{
    LinkStack S;
    while(true)
    {
        menu();
        int n;
        scanf("%d",&n);
        switch(n)
        {
            int x;
        case 0:
            if(InitStack(S)) printf("\n初始化成功\n\n");
            continue;
        case 1:
            cout<<"输入一个元素"<<endl;
            cin>>x;
            Push(S,x);
            continue;
        case 2:
            x=Pop(S,x);
            printf("删除%d\n",x);
            continue;
        case 3:
            GetTopElem(S,&x);
            printf("栈顶元素是%d\n",x);
            continue;
        case 4:
            ClearStack(S);
            printf("\n栈已清空\n");
            continue;
        default:
            break;
        }
        if(n==5) break;
    }
    return 0;
}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开始King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值