c数据结构 -- 栈与队列

Posted cl94

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c数据结构 -- 栈与队列相关的知识,希望对你有一定的参考价值。

栈和队列
  ·栈和队列是两种常用的、重要的数据结构
  ·栈和队列是限定插入和删除只能在表的“端点”进行的线性表

  栈
    只能在队尾插入,只能在队尾删除 -- 后进后出
    表尾称为栈顶;表头称为栈底
    插入元素到栈顶(即表尾)的操作,称为入栈
    从栈顶删除最后一个元素的操作,称为出栈

  注意:函数调用的流程就是入栈和出栈的实现,遵循后调用的先返回
  队列
    只能在队尾插入,只能在对队头删除 -- 先进先出

  顺序栈的实现:

  

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0 
#define MAXSIZE 100
typedef struct Stack{ // 顺序栈,存储类型为int 
    int *base;  // 指向底部 
    int *top;  // 指向顶部 
    int length; 
}Stack; 
typedef Stack *SqStack;
int initStack(SqStack *s);
int isEmpty(SqStack s);
int showStack(SqStack s);
int push(SqStack *s,int num);
 int pop(SqStack *s);
// 顺序栈的算法 
int main(void){
     SqStack s = (SqStack)malloc(sizeof(Stack));
     initStack(&s); 
     printf("顺序栈为空:%d 
",isEmpty(s)); 
     printf("顺序栈长度:%d 
",getLength(s)); 
     push(&s,1);
     push(&s,2);
     push(&s,3);
      pop(&s);
     showStack(s);
}  
// 遍历栈
int showStack(SqStack s){
    while(s->top > s->base){
        printf("值:%d 
", *(s->top-1));
        s->top--;
    }
    return OK;
}
// 入栈
int push (SqStack *s,int num){
    // 判断是否上溢 
    if( getLength(*s) >= (*s)->length ) {
        printf("上溢 
");
        return ERROR;
    }
    *(*s)->top++ = num;

    return OK;
} 
// 出栈
 int pop(SqStack *s){
    // 判断是否下溢
    if(getLength(*s) <= 0){
        printf("下溢 
");
        return ERROR;
    } 
    (*s)->top--;
    //free(temp);
    return OK;
} 
// 求长度
int getLength(SqStack s) {
    int length = s->top - s->base; // 指针相减,结果为值的个数 
    return length;
}
// 判断是否为空
int isEmpty(SqStack s){
    if(s->top == s->base){
        return OK;
    }else{
        return ERROR;
    }
} 
// 构造一个空栈
int initStack(SqStack *s){
    (*s)->base = (int*)malloc(sizeof(int));
    if(!(*s)->base){
        return ERROR; // 内存分配失败 
    }
    (*s)->top = (*s)->base; // 栈顶指针等于栈底指针 
    (*s)->length = MAXSIZE;
    return OK;
} 

链栈的实现:

   

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0 
#define MAXSIZE 100
typedef struct Stack{ // 链栈,存储类型为int 
    int x; 
    struct Stack *next;  // 指向的是最后一个元素,入栈出栈都是它 if != NULL 
}Stack; 
typedef Stack *SqStack;
int initStack(SqStack *s);
int isEmpty(SqStack s);
int showStack(SqStack s);
int push(SqStack *s,int num);
 int pop(SqStack *s);
// 链栈的算法 
int main(void){
     SqStack s = (SqStack)malloc(sizeof(Stack));
     initStack(&s); 
     printf("链栈为空:%d 
",isEmpty(s)); 
     printf("链栈长度:%d 
",getLength(s)); 
     push(&s,1);
     push(&s,2);
     push(&s,3);
     pop(&s);
     showStack(s);
}  
// 遍历栈
int showStack(SqStack s){
    while(s) {
        printf("值:%d 
", s->x);
        s = s->next;
    }
    return OK;
}
// 入栈
int push (SqStack *s,int num){
    SqStack temp = (SqStack)malloc(sizeof(Stack));
    temp->x = num;    
    temp->next = (*s); // 精髓之处 
    (*s) = temp; // !!! 指针的运用 
    return OK;
} 
// 出栈
 int pop(SqStack *s){
    // 判断是否下溢
    if(!(*s)){
        printf("下溢 
");
        return ERROR;
    } 
    SqStack temp =  *s;
    (*s) = (*s)->next; 
    free(temp); // 释放内存 
    return OK;
} 
// 求长度
int getLength(SqStack s) {
    int length = 0;
    while(s){
        length++;
        s = s->next;
    }
    return length;
}
// 判断是否为空
int isEmpty(SqStack s){
    if(!s){
        return OK;
    }else{
        return ERROR;
    }
} 
// 构造一个空栈
int initStack(SqStack *s){
    // 构建一个空栈,栈顶指针置为空 
    *s = NULL;
    return OK;
} 

 

 

以上是关于c数据结构 -- 栈与队列的主要内容,如果未能解决你的问题,请参考以下文章

c数据结构 -- 栈与队列

数据结构与算法栈与队列C语言版

C/C++|DataStructure栈与队列之栈的顺序存储结构

C++,栈与队列

浅谈栈与队列(C语言)

栈与队列