码迷,mamicode.com
首页 > 其他好文 > 详细

c数据结构 -- 栈与队列

时间:2020-01-31 12:45:46      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:error   调用   线性   分配   while   结果   void   内存   相减   

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

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

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

  顺序栈的实现:

  

#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 \n",isEmpty(s)); 
     printf("顺序栈长度:%d \n",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 \n", *(s->top-1));
        s->top--;
    }
    return OK;
}
// 入栈
int push (SqStack *s,int num){
    // 判断是否上溢 
    if( getLength(*s) >= (*s)->length ) {
        printf("上溢 \n");
        return ERROR;
    }
    *(*s)->top++ = num;

    return OK;
} 
// 出栈
 int pop(SqStack *s){
    // 判断是否下溢
    if(getLength(*s) <= 0){
        printf("下溢 \n");
        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 \n",isEmpty(s)); 
     printf("链栈长度:%d \n",getLength(s)); 
     push(&s,1);
     push(&s,2);
     push(&s,3);
     pop(&s);
     showStack(s);
}  
// 遍历栈
int showStack(SqStack s){
    while(s) {
        printf("值:%d \n", 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("下溢 \n");
        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数据结构 -- 栈与队列

标签:error   调用   线性   分配   while   结果   void   内存   相减   

原文地址:https://www.cnblogs.com/cl94/p/12244883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!