DS-栈

前言


博文中主要是链栈的基本操作的知识点,(初始化链栈、创建链栈、入栈、出栈
、取栈顶元素、栈长度、栈空判断、链栈的销毁等)主要通过程序和程序的注释对这块内容进行总结和学习。

链栈基本操作


链栈基本操作的程序代码

#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

typedef struct node{
    ElemType data;
    struct node *next;
}StackNode, *LinkStack;

//创建一个空栈  
Status InitStack(LinkStack &L){
    L = new StackNode;
    L->next = NULL;
    return OK;
}

//创建一个栈 
Status CreateStack(LinkStack &L){
    cout<<"请输入栈空间的长度:"<<endl;
    int l;
    cin>>l;
    //定义一个结点指针 做结点数据的插入操作 
    //同链表的头插法 
    cout<<"请输栈内的数据:"<<endl;
    for(int i=0;i<l;i++){
        StackNode *p = new StackNode;
        cin>>p->data;
        p->next = L->next;
        L->next = p; 
    }   
    return OK;
} 

Status EmptyLinkStack(LinkStack L){
    if(L->next != NULL)
        return ERROR;
    return OK;
}

//销毁一个栈 
Status DestoryStack(LinkStack &L){
    //一个结点一个结点的删除
    while(L->next != NULL){
        StackNode *p = L->next;
        L->next = p->next;
        delete(p);
    } 
    return OK;
} 

//栈的输入 push
Status Push(LinkStack &L,ElemType e){   
    StackNode *p = new StackNode;
    p->data = e;
    p->next = L->next;
    L->next = p;
    return OK;
} 
//栈的输出 pop
Status Pop(LinkStack &L,ElemType e){
    //如果栈的内容为空的 给出提示 
    if(EmptyLinkStack(L)){
        cout<<"Pop异常!此时栈内容为空"<<endl;
        return ERROR; 
    }
    //执行一次出栈操作 
    StackNode *p = new StackNode;
    p = L->next;
    e = p->data; 
    L->next = p->next;
    delete(p); 
    return OK;
} 

Status GetTop(LinkStack &L,ElemType &e){
    //如果栈的内容为空的 给出提示 
    if(EmptyLinkStack(L)){
        cout<<"GetTop异常!此时栈内容为空"<<endl;
        return ERROR; 
    }
    StackNode *p = new StackNode;
    p = L->next;
    e = p->data;
    L->next = p->next;
    delete(p);
    return e;
} 

Status LenListStack(LinkStack L){
    int len = 0;
    StackNode *p = new StackNode;
    p = L->next;
    while(p){
        len++;
        p = p->next;
    }
    return len;
}



//栈内容的输出
Status PrintStack(LinkStack L){
    if(!EmptyLinkStack(L)){
        StackNode *p = L->next;
        cout<<"链栈内的元素内容是:"<<endl;
        while(p){
            cout<<p->data<<"  ";
            p = p->next;
        } 
        cout<<endl;
    }
    else{
        cout<<"此时栈内容为空"<<endl;
        return ERROR; 
    }
    return OK;
} 

int main(){
    LinkStack L;
    ElemType e,temp;
    //栈的初始化 
    InitStack(L);
    //创建栈
    CreateStack(L);
    //输出栈
    PrintStack(L);
    //入栈
    Push(L,99); 
    PrintStack(L);
    cout<<"链栈的长度为:"<<endl<<LenListStack(L)<<endl; 
    //出栈    
    Pop(L,e);
    cout<<"链栈的长度为:"<<endl<<LenListStack(L)<<endl; 
    PrintStack(L);
    //获取栈顶元素
    cout<<"获取的栈顶元素为:"<<endl<<GetTop(L,e)<<endl; 
    //清空栈 
    DestoryStack(L);
    PrintStack(L);
    return 0;
} 
/*
7
1 2 3 4 5 6 7
*/ 

程度运行的截图:
这里写图片描述

结语


针对栈的有关知识点,主要可以通过对有关栈的应用进行实践,其中包括有:函数的递归思想、进制间转换、回文串的判断、括号的匹配问题、中缀/后缀表达式、函数的调用、迷宫问题。

文中主要对链栈进行了总结,顺序栈的思路和链栈的类似,设有一个标志位top来表示栈的状态,push和pop该top位做出相应的改变即可。

家里面有点冷,自己有点懒散,ε=(´ο`*)))

猜你喜欢

转载自blog.csdn.net/gerald_jones/article/details/79177316
DS
今日推荐