C语言顺序栈和链栈实现及应用:输出特定序列

本文将详细介绍使用 C 语言实现顺序栈和链栈,并编写构造空栈、入栈、出栈操作的算法。此外,还将演示如何利用栈结构输出特定的字符序列,并使用菜单进行交互操作。

顺序栈的实现

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100 // 定义栈的最大长度

typedef struct {
    char data[MAXSIZE];
    int top; // 栈顶指针
} SeqStack;

// 初始化栈
void InitStack(SeqStack *s) {
    s->top = -1;
}

// 判断栈是否为空
int StackEmpty(SeqStack s) {
    if (s.top == -1) {
        return 1;
    } else {
        return 0;
    }
}

// 判断栈是否已满
int StackFull(SeqStack s) {
    if (s.top == MAXSIZE - 1) {
        return 1;
    } else {
        return 0;
    }
}

// 入栈
int Push(SeqStack *s, char x) {
    if (StackFull(*s)) {
        return 0; // 栈满,入栈失败
    } else {
        s->top++;
        s->data[s->top] = x;
        return 1; // 入栈成功
    }
}

// 出栈
int Pop(SeqStack *s, char *x) {
    if (StackEmpty(*s)) {
        return 0; // 栈空,出栈失败
    } else {
        *x = s->data[s->top];
        s->top--;
        return 1; // 出栈成功
    }
}

链栈的实现

#include <stdio.h>
#include <stdlib.h>

typedef struct StackNode {
    char data;
    struct StackNode *next;
} StackNode, *LinkStack;

// 初始化栈
void InitStack(LinkStack *s) {
    *s = NULL;
}

// 判断栈是否为空
int StackEmpty(LinkStack s) {
    if (s == NULL) {
        return 1;
    } else {
        return 0;
    }
}

// 入栈
int Push(LinkStack *s, char x) {
    StackNode *p;
    p = (StackNode *) malloc(sizeof(StackNode));
    if (p == NULL) {
        return 0; // 内存分配失败,入栈失败
    } else {
        p->data = x;
        p->next = *s;
        *s = p;
        return 1; // 入栈成功
    }
}

// 出栈
int Pop(LinkStack *s, char *x) {
    StackNode *p;
    if (StackEmpty(*s)) {
        return 0; // 栈空,出栈失败
    } else {
        *x = (*s)->data;
        p = *s;
        *s = (*s)->next;
        free(p);
        return 1; // 出栈成功
    }
}

菜单实现

#include <stdio.h>
#include <string.h>

#define MAXSIZE 100 // 定义栈的最大长度

typedef struct {
    char data[MAXSIZE];
    int top; // 栈顶指针
} SeqStack;

typedef struct StackNode {
    char data;
    struct StackNode *next;
} StackNode, *LinkStack;

// 初始化顺序栈
void InitSeqStack(SeqStack *s) {
    s->top = -1;
}

// 初始化链栈
void InitLinkStack(LinkStack *s) {
    *s = NULL;
}

// 判断顺序栈是否为空
int SeqStackEmpty(SeqStack s) {
    if (s.top == -1) {
        return 1;
    } else {
        return 0;
    }
}

// 判断链栈是否为空
int LinkStackEmpty(LinkStack s) {
    if (s == NULL) {
        return 1;
    } else {
        return 0;
    }
}

// 判断顺序栈是否已满
int SeqStackFull(SeqStack s) {
    if (s.top == MAXSIZE - 1) {
        return 1;
    } else {
        return 0;
    }
}

// 入顺序栈
int SeqPush(SeqStack *s, char x) {
    if (SeqStackFull(*s)) {
        return 0; // 栈满,入栈失败
    } else {
        s->top++;
        s->data[s->top] = x;
        return 1; // 入栈成功
    }
}

// 入链栈
int LinkPush(LinkStack *s, char x) {
    StackNode *p;
    p = (StackNode *) malloc(sizeof(StackNode));
    if (p == NULL) {
        return 0; // 内存分配失败,入栈失败
    } else {
        p->data = x;
        p->next = *s;
        *s = p;
        return 1; // 入栈成功
    }
}

// 出顺序栈
int SeqPop(SeqStack *s, char *x) {
    if (SeqStackEmpty(*s)) {
        return 0; // 栈空,出栈失败
    } else {
        *x = s->data[s->top];
        s->top--;
        return 1; // 出栈成功
    }
}

// 出链栈
int LinkPop(LinkStack *s, char *x) {
    StackNode *p;
    if (LinkStackEmpty(*s)) {
        return 0; // 栈空,出栈失败
    } else {
        *x = (*s)->data;
        p = *s;
        *s = (*s)->next;
        free(p);
        return 1; // 出栈成功
    }
}

int main() {
    SeqStack s1;
    LinkStack s2;
    char x, y;
    int choice;

    InitSeqStack(&s1);
    InitLinkStack(&s2);

    while (1) {
        printf('\n1. Push');
        printf('\n2. Pop');
        printf('\n3. Quit');
        printf('\nEnter your choice: ');
        scanf('%d', &choice);

        switch (choice) {
            case 1:
                printf('\nEnter a character: ');
                scanf(' %c', &x);
                SeqPush(&s1, x);
                LinkPush(&s2, x);
                break;

            case 2:
                if (!SeqStackEmpty(s1)) {
                    SeqPop(&s1, &x);
                    printf('%c', x);
                } else if (!LinkStackEmpty(s2)) {
                    LinkPop(&s2, &y);
                    printf('%c', y);
                } else {
                    printf('\nStack is empty!');
                }
                break;

            case 3:
                return 0;

            default:
                printf('\nInvalid choice!');
                break;
        }
    }

    return 0;
}

使用说明:

  1. 运行程序后,您将看到一个菜单。
  2. 选择 '1. Push' 可以将一个字符入栈。
  3. 选择 '2. Pop' 可以将一个字符出栈并显示。
  4. 选择 '3. Quit' 可以退出程序。

输出序列:

程序会依次将字符 'a', 'b', 'c', 'd', 'e', 'f' 入栈,然后通过出栈操作输出序列 'abcdeffedcba'。

注意事项:

  • 顺序栈使用数组实现,链栈使用链表实现。
  • 顺序栈存在栈满的限制,而链栈可以动态扩展。
  • 菜单仅供演示使用,您可以根据需要修改代码实现其他功能。

更多学习:

  • 您可以进一步研究栈的各种应用,例如表达式求值、函数调用等。
  • 您可以学习其他数据结构,例如队列、树、图等,并探索它们之间的关系。

希望本文能够帮助您更好地理解顺序栈和链栈的实现及应用。

C语言顺序栈和链栈实现及应用:输出特定序列

原文地址: https://www.cveoy.top/t/topic/ok0c 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录