顺序栈和链式栈的实现(c语言)

1、顺序栈的实现

#include <stdio.h>
#include <malloc.h>
typedef int Status;
typedef char SElemType;
#define stack_INIT_SIZE     100  //定义栈空间大小
#define stackINCREMENT  10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
 typedef struct {
       SElemType  *base;   //栈底指针
       SElemType  *top;     //栈顶指针
       int stacksize;       //栈空间
}Sqstack;

Status iniStack(Sqstack &S) //初始化栈
{//构造一个空栈S
    S.base=(SElemType*)malloc(stack_INIT_SIZE * sizeof(SElemType));
    if(!S.base)return(ERROR);
    S.top=S.base;  //栈顶指针指向栈底指针表示栈为空
    S.stacksize=stack_INIT_SIZE;
    return OK;
  }//InitStack

Status push(Sqstack &S,SElemType x)  //入栈
{
    //栈不满的情况下进行入栈操作
    if(S.top-S.base>=S.stacksize){
        S.base=(SElemType * )realloc(S.base,
            (S.stacksize+stackINCREMENT)*sizeof(SElemType));
        if(!S.base)return(ERROR);
        S.top=S.base+S.stacksize;  //设置栈顶指针位置
        S.stacksize+=stackINCREMENT;  //累积入栈元素空间
      }
    *S.top++=x;  //先入栈,指针再加1
    return OK;
}

Status pop(Sqstack &S,SElemType &e)  //出栈
{
    //栈不空时进行出栈操作
    if(S.top==S.base)return ERROR;
        e=*--S.top;  //指针先减1,再出栈
    return OK;
}

int main()
{
    Sqstack S;
    SElemType k;
    iniStack(S);  //栈初始化
    if(push(S,'A')==ERROR)  //入栈
        printf("入栈失败!\n");
    if(push(S,'B')==ERROR)  //入栈
        printf("入栈失败!\n");
    if(push(S,'C')==ERROR)  //入栈
        printf("入栈失败!\n");
    if(pop(S,k)==ERROR)  //出栈
         printf("出栈失败!\n");
    else
        printf("出栈元素为:%c\n",k);
    if(pop(S,k)==ERROR)  //出栈
         printf("出栈失败!\n");
    else
        printf("出栈元素为:%c\n",k);
    return 0;
}
 

2、链式栈的实现

// 链栈
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int ElemType;
typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode, *LiStack;

// 初始化
bool InitStack(LiStack *S){
    (*S) = (LiStack)malloc(sizeof(LinkNode));   // 申请空间
    if(*S == NULL) return false;    // 分配失败
    (*S)->next = NULL;              // 初始指向空
    return true;
}

// 入栈(结点头插)
bool Push(LiStack S, ElemType e){
    LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode));
    if(S->next == NULL){  // 判断栈空
        // 先创建第一个结点
        p->data = e;       
        p->next = NULL;     // 后继指向空
        S->next = p;
    }else{  // 后续结点都是在头结点和第一个结点之间插入
        p->next = S->next;  // p指向头指针原后继
        p->data = e;        // 存入数据
        S->next = p;        // 头指针后继指向p
    }
    return true;

// 创建栈
bool CreateStack(LiStack S){
    ElemType e;
    scanf("%d", &e);    // 读入数据   
    while(e != 9999){   // 输入9999停止  
        Push(S, e);         // 调用入栈函数进行入栈
        scanf("%d", &e);    // 读入数据
    }
    return true;
}

// 出栈
bool Pop(LiStack S, ElemType *e){
    if(S == NULL || S->next == NULL) return false;
    LinkNode *p = S->next;
    S->next = p->next;  // 指向下一个结点
    free(p);
    return true;
}

// 读取栈顶元素
bool GetTop(LiStack S, ElemType *e){
    if(S == NULL) return false;
    *e = S->next->data; // 栈顶元素赋给e通过指针传回主函数
    return true;
}

// 输出栈
void PrintStack(LiStack S){
    LinkNode *p;
    p = S->next;
    while(p != NULL){           // 遍历栈           
        printf("%d ", p->data); // 输出数据域
        p = p->next;
    }
    printf("\n");
}


int main(){
    LiStack S;      // 声明
    InitStack(&S);  // 初始化 
    int status;     // 操作码
    ElemType e;     // 元素
    while(1){
        printf("Please enter a status code:\n1.CreateStack      2.Push        3.Pop\n");
        printf("4.GetTop           5.PrintStack  0.Exit\n");
        scanf("%d", &status);
        if(status == 0) break;
        switch (status){
        case 1:     // 创建栈
            printf("Please enter the elements one by one in order!\n");
            CreateStack(S); 
            PrintStack(S);
            break;
        case 2:     // 入栈
            printf("Please enter the element value you want to push\n");
            scanf("%d", &e);
            if(Push(S, e)){
                printf("Push successfully!\n");
            }else{
                printf("Failed to Push!\n");
            }
            PrintStack(S);
            break;
        case 3:     // 出栈
            if(Pop(S, &e)){
                printf("Element value %d Pop successfully\n", e);
            }else{
                printf("Failed to Pop!\n");
            }
            PrintStack(S);
            break;
        case 4:     // 读取栈顶元素
            if(GetTop(S, &e)){
                printf("The top elem is %d\n", e);
            }else{
                printf("The LiStack is empty!\n");
            }
            break;
        case 5:     // 输出表
            PrintStack(S);
            break;
        default:
            printf("Error!\n");
            break;
        }
    }
    return 0;
}
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值