栈的顺序存储结构C语言

栈是一种先入后出的数据结构,应用也非常广泛,例如在电脑中文件管理里,点击进入多层文件里,然后点返回键,又能回到原处。双击进入相当于入栈,返回相当于出栈,返回时只能返回到当前级的上一级。
栈的存储结构与链表一样,有顺序存储结构和链式存储结构,先来谈一谈顺序存储结构,可以用数组来实现顺序栈,数组下标为0的一端为栈底,再定义一个变量top,用来指向栈顶元素。所以top的值必须小于数组的长度,数组的第一个下标为0,所以top等于0是表示栈只有一个元素。若栈为空,将其判定条件定义为top等于-1。
下面给出顺序栈部分功能实现的代码:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef struct{
    int data[MAXSIZE];
    int top;
}SqStack;
void visit(int c){
    printf("%d ", c);
}
void StackTraverse(SqStack S){
    int i = 0;
    while (i <= S.top){
        visit(S.data[i++]);
        printf("\n");
    }
}
void InitStack(SqStack *S)        //初始化操作,建立一个空栈
{
    S->top = -1;
}
void ClearStack(SqStack *S)      //将栈清空
{
    S->top = -1;
}
bool StackEmpty(SqStack S)      //判断栈是否为空
{
    if (S.top == -1)
        return false;
    else
        return true;
}
void Top(SqStack S, int *e)  //返回栈顶元素
{
    if (S.top == -1)   //栈为空
        exit(0);
    else
    *e = S.data[S.top];
}
void Push(SqStack *S, int e)    //入栈操作
{
    if (S->top == MAXSIZE - 1)
        exit(0);
    else
        S->top++;
        S->data[S->top] = e;
}
void Pop(SqStack *S, int *e)     //出栈操作
{
    if (S->top == -1)
        exit(0);
    else
        *e = S->data[S->top];
    S->top--;
}
int StackLength(SqStack S){
    return S.top + 1;
}
int main(){
    SqStack s;
    int i=0;
    InitStack(&s);
    for (i = 0; i < 10; i++){
        Push(&s, i);
    }
    StackTraverse(s);
    int e;
    Top(s,&e);
    printf("%d\n", e);

    Pop(&s, &e);
    StackTraverse(s);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,熟练掌握顺序(也称为简单堆)的存储结构通常涉及到以下几个步骤: 1. 定义结构:你可以定义一个结构体类型来表示,包含一个数组(用于存储数据)和两个索引变量一个用于指向顶元素(top),另一个用于指向底元素(bottom)。 ```c typedef struct { int* stack_array; // 存储元素的数组 int top; // 顶索引 int bottom; // 底索引 int size; // 的最大容量 } Stack; ``` 2. 初始化:创建一个实例时,初始化顶和底为-1(表示为空),并分配足够的内存空间给数组。 ```c Stack createStack(int capacity) { Stack s; s.stack_array = (int*)malloc(capacity * sizeof(int)); if (!s.stack_array) { printf("Memory allocation failed.\n"); return NULL; } s.top = s.bottom = -1; s.size = capacity; return s; } ``` 3. 入操作(push):当新元素需要入时,将新元素存放在顶,并更新顶索引。 ```c void push(Stack* s, int value) { if (s->top == s->size - 1) { printf("Stack overflow.\n"); return; } s->stack_array[++s->top] = value; } ``` 4. 出操作(pop):从顶移除并返回元素,同时更新顶索引。 ```c int pop(Stack* s) { if (s->top == s->bottom) { printf("Stack underflow.\n"); return -1; // 或者返回一个特定的错误代码 } return s->stack_array[s->top--]; } ``` 5. 判断是否为空和满:可以通过比较顶索引和底索引来判断。 ```c int isEmpty(Stack s) { return s.top == s.bottom; } int isFull(Stack s) { return s.top == s.size - 1; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值