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 \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;
} 

 

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

时间: 2024-10-08 19:53:23

c数据结构 -- 栈与队列的相关文章

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

C#数据结构—栈和队列

一:栈 栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制.栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以,把栈和队列称为操作受限的线性表. 1:栈的定义及基本运算 栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom).当栈中没有数据元素时叫

数据结构-栈、队列和链表

一.栈stack 是后进先出的数据结构 栈顶指针指的始终是栈最上方元素的一个标记,即放在最上面的元素.栈顶元素为空时令top为-1. 在使用pop()函数和top()函数时,需要使用empty()判断栈是否为空. 在STL中stack容器来编写代码,STL定义stack的复杂度是O(1). 常见函数: clear() size() empty() push() pop() top() 二.队列queue 是一种先进先出的数据结构 需要一个队首指针front来指向队首元素的前一个位置,而使用一个队

数据结构-栈和队列

栈和队列都是线性表,所以满足-只有一个节点没有前继,只有后继,只有一个节点只有后继没有前继,其他的节点只有一个前继只有一个后继. 栈的定义是先进后出,最典型的例子就是弹夹,最先进去的反而是最后射出来的,在实际的软件开发中会进经常的遇到这种类型的线性表,我们成为LIFO(Last in First out).可以把栈想象成是只有一个出口的容器,最先放进去的东西只能够等其上面的东西呗拿走之后才能够拿出来. 队列则是另外的一种线性表,队列在我们生活中就更常见了,比如排队啊什么的,队列讲的是先进先出,在

数据结构-栈与队列

相比于数组这种存储数据的数据,栈(Stock)和队列(Queue)主要作用是在程序中作为构思算法的辅助工具,是一种程序员开发过程中的便利工具.Stock和Queue具有访问受限以及更加抽象的特征. 一.栈 栈只允许访问最后一个插入的元素,即栈是先进后出(FILO)的一种数据结构.栈主要提供的算法包括push,pop和peek.其中push是插入一个元素,pop是弹出最近添加的一个元素,peek是返回最近添加的一个元素. 栈的底层实现可以是数组,也可以是链表,这里采用数组实现一个栈,代码如下: 1

JavaScript数据结构——栈和队列

栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 ------------------------------------------------------------------------------------------------------ 栈方法声明: 首先,采用数组来保存栈里的元素. 序号 方法 说明 1 push ( element(s) ) 添加一个(或几个)新元素到栈顶 2 pop ( ) 移除栈顶的元素,同时返回被移除的元素 3 peek ( )

数据结构——栈与队列

题目: 1.编写函数,采用链式存储实现栈的初始化.入栈.出栈操作 2.编写函数,采用顺序存储实现栈的初始化.入栈.出栈操作 3.编写函数,采用链式存储实现队列的初始化.入队.出队操作 4.编写函数,采用顺序存储实现队列的初始化.入队.出队操作 5.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法 题目分析: 1.顺序栈的类型定义 #define MAX 100  //栈的最大值 typedef struct {     ElemType *base;     int top; } 

考研数据结构-栈和队列

栈 栈是一种只能在一端进行插入或删除操作的线性表. 线性表:栈的逻辑结构属于线性表,只不过在操作上加了一些约束. 一端:可以插入或者删除元素的一端叫栈顶,另一端叫栈底. 顺序栈 1 int stack[maxSize]; 2 int top = -1; 3 4 //元素入栈 5 stack[++top] = x; 6 7 //元素出栈 8 x = stack[top--]; 链栈 1 LNode *head = (LNode*)malloc(sizeof(LNode)); 2 head→next