c语言实现顺序栈

顺序栈

采用顺存储的栈成为顺序栈,它利用一组地址连续的存储单元存放栈的元素,同时需要一个指针指向栈顶元素的位置。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义一个顺序栈
typedef struct {
    int data[10];
    int top;//用于指向栈顶元素
}sqStack;

//初始化一个空栈
void InitStack(sqStack &S){//需要改变栈内部的值,所以用引用类型
    S.top=-1;//空栈的数组0下标也无元素,所以初始值为-1
}

//判断空栈
bool EmptyStack(sqStack S){ //直接用传递过来的值,所以不用引用类型
    if (S.top==-1){
        printf("此栈为空栈
");
        return true;
    }
    return false;
}

//入栈
bool PushStack(sqStack &S,int value){
    //需要判断栈是否满
    if (S.top==9){
        return false;
    }
    S.data[++S.top]=value;//栈顶指针加1,并将value传进去
    return true;
}

//遍历栈中的值
void GetStack(sqStack S){
    for (int i = 0; i <= S.top; ++i) {
        printf("%d	%d
",i,S.data[i]);
    }
}

//出栈
bool PopStack(sqStack S){
    //判断是否是空栈
    if (S.top==-1){
        return false;
    }
    S.top--;
    return true;
}


int main(){
    sqStack s;
    InitStack(s);
    EmptyStack(s);
    PushStack(s,10);
    GetStack(s);
    return 0;
}

链栈

采用链式存储的栈成为链栈,相比于顺序栈,链栈的优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况,通常采用单链表实现,然后限定所有的操作都是在表头进行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//链栈
typedef struct node{
    int data;//数据域,不需要设置空间大小
    struct node *nextnode;
}*LkStack;

//初始化栈
LkStack InitStack(LkStack &S){
    S = (LkStack)malloc(sizeof(10));
    return S;
}

//入栈
LkStack PushStack(LkStack &S,int data){
    //定义一个LkStack的临时结点,然后将栈顶的值赋值给它
    LkStack tmp;
    tmp = S;
    //更新栈顶结点的数据
    S->data=data;
    S->nextnode=tmp;
    //释放临时结点
    free(tmp);
    return S;
}

int main(){
    LkStack stack;
    InitStack(stack);
    PushStack(stack,2);
    printf("%d",stack->data);
    return 0;
}
原文地址:https://www.cnblogs.com/szj666/p/13095540.html