鱼C论坛

 找回密码
 立即注册
查看: 562|回复: 8

[已解决]顺序栈的操作

[复制链接]
发表于 2023-12-6 20:35:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
顺序栈的操作
【实验要求】
(1) 建立含有若干个元素的顺序栈;
(2) 对已建立的顺序栈进行插入、删除、取栈顶元素等基本操作。
【实验提示】
首先定义顺序栈的数据类型 SqStack;对于题目要求的插入、删除、取栈顶
元素等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序栈的元
素。
最佳答案
2023-12-6 20:36:09
下面是一个简单的顺序栈的实现,包含了插入、删除和取栈顶元素等基本操作:
#include <stdio.h>#define MAXSIZE 100typedef struct {    int data[MAXSIZE];    int top;} SqStack;// 初始化栈void InitStack(SqStack *stack) {    stack->top = -1;  // 栈为空时,top为-1}// 判断栈是否为空int IsEmpty(SqStack *stack) {    return stack->top == -1;}// 判断栈是否已满int IsFull(SqStack *stack) {    return stack->top == MAXSIZE - 1;}// 插入元素int Push(SqStack *stack, int value) {    if (IsFull(stack)) {        printf("栈已满,无法插入元素\n");        return 0;    }    stack->data[++stack->top] = value;    return 1;}// 删除元素int Pop(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈已空,无法删除元素\n");        return 0;    }    stack->top--;    return 1;}// 取栈顶元素int GetTop(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈已空,无栈顶元素\n");        return 0;    }    return stack->data[stack->top];}// 输出栈的元素void PrintStack(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈为空\n");        return;    }    printf("栈的元素为:");    for (int i = 0; i <= stack->top; i++) {        printf("%d ", stack->data[i]);    }    printf("\n");}int main() {    SqStack stack;    InitStack(&stack);        Push(&stack, 1);    Push(&stack, 2);    Push(&stack, 3);    Push(&stack, 4);    PrintStack(&stack);  // 输出:栈的元素为:1 2 3 4    Pop(&stack);    Pop(&stack);    PrintStack(&stack);  // 输出:栈的元素为:1 2    int top = GetTop(&stack);    printf("栈顶元素为:%d\n", top);  // 输出:栈顶元素为:2        return 0;}
注意,这只是一个简单的顺序栈实现,没有考虑栈的动态扩容等情况。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-6 20:36:09 | 显示全部楼层    本楼为最佳答案   
下面是一个简单的顺序栈的实现,包含了插入、删除和取栈顶元素等基本操作:
#include <stdio.h>#define MAXSIZE 100typedef struct {    int data[MAXSIZE];    int top;} SqStack;// 初始化栈void InitStack(SqStack *stack) {    stack->top = -1;  // 栈为空时,top为-1}// 判断栈是否为空int IsEmpty(SqStack *stack) {    return stack->top == -1;}// 判断栈是否已满int IsFull(SqStack *stack) {    return stack->top == MAXSIZE - 1;}// 插入元素int Push(SqStack *stack, int value) {    if (IsFull(stack)) {        printf("栈已满,无法插入元素\n");        return 0;    }    stack->data[++stack->top] = value;    return 1;}// 删除元素int Pop(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈已空,无法删除元素\n");        return 0;    }    stack->top--;    return 1;}// 取栈顶元素int GetTop(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈已空,无栈顶元素\n");        return 0;    }    return stack->data[stack->top];}// 输出栈的元素void PrintStack(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈为空\n");        return;    }    printf("栈的元素为:");    for (int i = 0; i <= stack->top; i++) {        printf("%d ", stack->data[i]);    }    printf("\n");}int main() {    SqStack stack;    InitStack(&stack);        Push(&stack, 1);    Push(&stack, 2);    Push(&stack, 3);    Push(&stack, 4);    PrintStack(&stack);  // 输出:栈的元素为:1 2 3 4    Pop(&stack);    Pop(&stack);    PrintStack(&stack);  // 输出:栈的元素为:1 2    int top = GetTop(&stack);    printf("栈顶元素为:%d\n", top);  // 输出:栈顶元素为:2        return 0;}
注意,这只是一个简单的顺序栈实现,没有考虑栈的动态扩容等情况。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-12-6 20:44:02 | 显示全部楼层
FishC_GPT 发表于 2023-12-6 20:36
下面是一个简单的顺序栈的实现,包含了插入、删除和取栈顶元素等基本操作:

说明整段代码的思路和求出时间复杂度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-6 20:44:52 | 显示全部楼层
tangpeng04 发表于 2023-12-06 20:44
说明整段代码的思路和求出时间复杂度

这段代码实现了一个简单的顺序栈。具体来说,代码中定义了一个结构体SqStack,它包含两个成员变量:data用于存储栈中的元素值,top用于记录栈顶的位置。

代码中包含了一些基本操作:

1. InitStack函数用于初始化栈,将top设置为-1,表示栈为空。
2. IsEmpty函数判断栈是否为空,即栈顶位置是否为-1。
3. IsFull函数判断栈是否已满,即栈顶位置是否达到了最大容量。
4. Push函数用于将元素插入栈中,首先判断栈是否已满,如果满了则返回0,否则将值赋给data,top加1。
5. Pop函数用于删除栈顶元素,首先判断栈是否为空,如果是则返回0,否则将top减1。
6. GetTop函数用于取栈顶元素的值,首先判断栈是否为空,如果是则返回0,否则返回data的值。
7. PrintStack函数用于输出栈中的元素,首先判断栈是否为空,如果是则输出"栈为空",否则通过循环将栈中的元素逐个输出。

最后,在main函数中进行了一些测试操作,先初始化栈,然后进行插入、删除和取栈顶元素等操作,并通过PrintStack函数将栈中的元素输出。

时间复杂度分析:
1. 初始化栈操作的时间复杂度为O(1)。
2. 判断栈是否为空和判断栈是否已满的操作时间复杂度均为O(1)。
3. 插入元素、删除元素和取栈顶元素的操作时间复杂度均为O(1)。
4. 输出栈中的元素操作的时间复杂度为O(n),其中n为栈中元素的个数。
因此,整段代码的时间复杂度主要取决于输出栈中的元素操作,为O(n)。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-6 20:58:18 | 显示全部楼层
FishC_GPT 发表于 2023-12-6 20:44
这段代码实现了一个简单的顺序栈。具体来说,代码中定义了一个结构体SqStack,它包含两个成员变量:data ...

【实验要求】
请写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
#define StackSize 100 //假定预分配的栈空间最多为 100 个元素
typedef char DataType;//假定栈元素的数据类型为字符
代码注释详细点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-6 21:04:32 | 显示全部楼层
tangpeng04 发表于 2023-12-06 20:58
【实验要求】
请写一个算法判定给定的字符向量是否为 ...

下面是一个判断给定字符向量是否为回文的算法实现:
++#include <stdio.h>#include <string.h>#define StackSize 100typedef char DataType;typedef struct {    DataType data[StackSize];    int top;} SqStack;// 初始化栈void InitStack(SqStack *stack) {    stack->top = -1;}// 判断栈是否为空int IsEmpty(SqStack *stack) {    return stack->top == -1;}// 判断栈是否已满int IsFull(SqStack *stack) {    return stack->top == StackSize - 1;}// 入栈操作int Push(SqStack *stack, DataType value) {    if (IsFull(stack)) {        printf("栈已满,无法插入元素\n");        return 0;    }    stack->top++;    stack->data[stack->top] = value;    return 1;}// 出栈操作int Pop(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈已空,无法删除元素\n");        return 0;    }    stack->top--;    return 1;}// 获取栈顶元素DataType GetTop(SqStack *stack) {    if (IsEmpty(stack)) {        printf("栈已空,无栈顶元素\n");        return '\0';    }    return stack->data[stack->top];}// 判断给定字符向量是否为回文int IsPalindrome(DataType *str) {    int len = strlen(str);        SqStack stack;    InitStack(&stack);        // 将前一半字符入栈    for (int i = 0; i < len / 2; i++) {        Push(&stack, str[i]);    }        // 当字符个数为奇数时,跳过中间字符    if (len % 2 != 0) {        len++;    }        // 判断后一半字符与栈中的字符是否相等    for (int i = len / 2; i < len; i++) {        if (str[i] != GetTop(&stack)) {            return 0;        }        Pop(&stack);    }        return 1;}int main() {    DataType str[] = "abcddcba";        if (IsPalindrome(str)) {        printf("给定字符向量是回文\n");    } else {        printf("给定字符向量不是回文\n");    }        return 0;}
这段代码中定义了一个结构体`SqStack`用于表示顺序栈,包含一个字符数组`data`用于存储栈元素,以及一个整型变量`top`用于记录栈顶位置。

主要的操作包括初始化栈、判断栈是否为空、判断栈是否已满、入栈、出栈和获取栈顶元素。

`IsPalindrome`函数是判断给定字符向量是否为回文的具体实现。算法的思路是将前一半的字符依次入栈,然后与后一半的字符逐个比较,如果有不相等的则返回0,否则返回1。

在主函数中,定义了一个字符向量`str`,通过调用`IsPalindrome`函数判断给定字符向量是否为回文,并输出相应的结果。

该算法的时间复杂度为O(n),其中n为字符向量的长度。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-6 21:11:38 | 显示全部楼层
FishC_GPT 发表于 2023-12-6 21:04
下面是一个判断给定字符向量是否为回文的算法实现:

字符串由用户输入,时间复杂度分析详细一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-6 21:12:11 | 显示全部楼层
tangpeng04 发表于 2023-12-06 21:11
字符串由用户输入,时间复杂度分析详细一点

如果字符串长度为n,则时间复杂度分析如下:

1. 初始化栈:时间复杂度为O(1)。

2. 判断栈是否为空:时间复杂度为O(1)。

3. 判断栈是否已满:时间复杂度为O(1)。

4. 入栈操作:由于需要将前一半字符依次入栈,所以需要进行n/2次入栈操作,每次操作的时间复杂度为O(1),因此总的时间复杂度为O(n/2)。

5. 出栈操作:由于需要将后一半字符逐个与栈中元素比较并出栈,所以需要进行n/2次出栈操作,每次操作的时间复杂度为O(1),因此总的时间复杂度为O(n/2)。

6. 获取栈顶元素:时间复杂度为O(1)。

综上所述,算法的时间复杂度为O(n/2),在大O表示法中可以简化为O(n)。需要注意的是,这里的时间复杂度只考虑了字符入栈和出栈的情况,没有考虑输入字符串的读取过程。如果字符串的输入过程需要读取字符到内存中,则会存在额外的时间消耗,这部分时间消耗的大小与具体的输入方式有关,不在算法本身的时间复杂度之内。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-6 21:17:36 | 显示全部楼层
FishC_GPT 发表于 2023-12-6 21:12
如果字符串长度为n,则时间复杂度分析如下:

1. 初始化栈:时间复杂度为O(1)。

用两个顺序栈实现一个共享栈,具体要求为:设有两个栈都采用顺序栈方式,共
享一个存储区,[0,maxsize - 1],采用栈顶相向,迎面增长的存储方式,设计
出栈和入栈等操作算法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表