鱼C论坛

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

[已解决]顺序栈的操作

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

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

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

x
顺序栈的操作
【实验要求】
(1) 建立含有若干个元素的顺序栈;
(2) 对已建立的顺序栈进行插入、删除、取栈顶元素等基本操作。
【实验提示】
首先定义顺序栈的数据类型 SqStack;对于题目要求的插入、删除、取栈顶
元素等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序栈的元
素。
最佳答案
2023-12-6 20:36:09
下面是一个简单的顺序栈的实现,包含了插入、删除和取栈顶元素等基本操作:
  1. #include <stdio.h>
  2. #define MAXSIZE 100
  3. typedef struct {
  4.     int data[MAXSIZE];
  5.     int top;
  6. } SqStack;
  7. // 初始化栈
  8. void InitStack(SqStack *stack) {
  9.     stack->top = -1;  // 栈为空时,top为-1
  10. }
  11. // 判断栈是否为空
  12. int IsEmpty(SqStack *stack) {
  13.     return stack->top == -1;
  14. }
  15. // 判断栈是否已满
  16. int IsFull(SqStack *stack) {
  17.     return stack->top == MAXSIZE - 1;
  18. }
  19. // 插入元素
  20. int Push(SqStack *stack, int value) {
  21.     if (IsFull(stack)) {
  22.         printf("栈已满,无法插入元素\n");
  23.         return 0;
  24.     }
  25.     stack->data[++stack->top] = value;
  26.     return 1;
  27. }
  28. // 删除元素
  29. int Pop(SqStack *stack) {
  30.     if (IsEmpty(stack)) {
  31.         printf("栈已空,无法删除元素\n");
  32.         return 0;
  33.     }
  34.     stack->top--;
  35.     return 1;
  36. }
  37. // 取栈顶元素
  38. int GetTop(SqStack *stack) {
  39.     if (IsEmpty(stack)) {
  40.         printf("栈已空,无栈顶元素\n");
  41.         return 0;
  42.     }
  43.     return stack->data[stack->top];
  44. }
  45. // 输出栈的元素
  46. void PrintStack(SqStack *stack) {
  47.     if (IsEmpty(stack)) {
  48.         printf("栈为空\n");
  49.         return;
  50.     }
  51.     printf("栈的元素为:");
  52.     for (int i = 0; i <= stack->top; i++) {
  53.         printf("%d ", stack->data[i]);
  54.     }
  55.     printf("\n");
  56. }
  57. int main() {
  58.     SqStack stack;
  59.     InitStack(&stack);
  60.    
  61.     Push(&stack, 1);
  62.     Push(&stack, 2);
  63.     Push(&stack, 3);
  64.     Push(&stack, 4);
  65.     PrintStack(&stack);  // 输出:栈的元素为:1 2 3 4
  66.     Pop(&stack);
  67.     Pop(&stack);
  68.     PrintStack(&stack);  // 输出:栈的元素为:1 2
  69.     int top = GetTop(&stack);
  70.     printf("栈顶元素为:%d\n", top);  // 输出:栈顶元素为:2
  71.    
  72.     return 0;
  73. }
复制代码

注意,这只是一个简单的顺序栈实现,没有考虑栈的动态扩容等情况。

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

使用道具 举报

发表于 2023-12-6 20:36:09 | 显示全部楼层    本楼为最佳答案   
下面是一个简单的顺序栈的实现,包含了插入、删除和取栈顶元素等基本操作:
  1. #include <stdio.h>
  2. #define MAXSIZE 100
  3. typedef struct {
  4.     int data[MAXSIZE];
  5.     int top;
  6. } SqStack;
  7. // 初始化栈
  8. void InitStack(SqStack *stack) {
  9.     stack->top = -1;  // 栈为空时,top为-1
  10. }
  11. // 判断栈是否为空
  12. int IsEmpty(SqStack *stack) {
  13.     return stack->top == -1;
  14. }
  15. // 判断栈是否已满
  16. int IsFull(SqStack *stack) {
  17.     return stack->top == MAXSIZE - 1;
  18. }
  19. // 插入元素
  20. int Push(SqStack *stack, int value) {
  21.     if (IsFull(stack)) {
  22.         printf("栈已满,无法插入元素\n");
  23.         return 0;
  24.     }
  25.     stack->data[++stack->top] = value;
  26.     return 1;
  27. }
  28. // 删除元素
  29. int Pop(SqStack *stack) {
  30.     if (IsEmpty(stack)) {
  31.         printf("栈已空,无法删除元素\n");
  32.         return 0;
  33.     }
  34.     stack->top--;
  35.     return 1;
  36. }
  37. // 取栈顶元素
  38. int GetTop(SqStack *stack) {
  39.     if (IsEmpty(stack)) {
  40.         printf("栈已空,无栈顶元素\n");
  41.         return 0;
  42.     }
  43.     return stack->data[stack->top];
  44. }
  45. // 输出栈的元素
  46. void PrintStack(SqStack *stack) {
  47.     if (IsEmpty(stack)) {
  48.         printf("栈为空\n");
  49.         return;
  50.     }
  51.     printf("栈的元素为:");
  52.     for (int i = 0; i <= stack->top; i++) {
  53.         printf("%d ", stack->data[i]);
  54.     }
  55.     printf("\n");
  56. }
  57. int main() {
  58.     SqStack stack;
  59.     InitStack(&stack);
  60.    
  61.     Push(&stack, 1);
  62.     Push(&stack, 2);
  63.     Push(&stack, 3);
  64.     Push(&stack, 4);
  65.     PrintStack(&stack);  // 输出:栈的元素为:1 2 3 4
  66.     Pop(&stack);
  67.     Pop(&stack);
  68.     PrintStack(&stack);  // 输出:栈的元素为:1 2
  69.     int top = GetTop(&stack);
  70.     printf("栈顶元素为:%d\n", top);  // 输出:栈顶元素为:2
  71.    
  72.     return 0;
  73. }
复制代码

注意,这只是一个简单的顺序栈实现,没有考虑栈的动态扩容等情况。

以上回复来自 -- 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
【实验要求】
请写一个算法判定给定的字符向量是否为 ...

下面是一个判断给定字符向量是否为回文的算法实现:
  1. ++
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define StackSize 100
  5. typedef char DataType;
  6. typedef struct {
  7.     DataType data[StackSize];
  8.     int top;
  9. } SqStack;
  10. // 初始化栈
  11. void InitStack(SqStack *stack) {
  12.     stack->top = -1;
  13. }
  14. // 判断栈是否为空
  15. int IsEmpty(SqStack *stack) {
  16.     return stack->top == -1;
  17. }
  18. // 判断栈是否已满
  19. int IsFull(SqStack *stack) {
  20.     return stack->top == StackSize - 1;
  21. }
  22. // 入栈操作
  23. int Push(SqStack *stack, DataType value) {
  24.     if (IsFull(stack)) {
  25.         printf("栈已满,无法插入元素\n");
  26.         return 0;
  27.     }
  28.     stack->top++;
  29.     stack->data[stack->top] = value;
  30.     return 1;
  31. }
  32. // 出栈操作
  33. int Pop(SqStack *stack) {
  34.     if (IsEmpty(stack)) {
  35.         printf("栈已空,无法删除元素\n");
  36.         return 0;
  37.     }
  38.     stack->top--;
  39.     return 1;
  40. }
  41. // 获取栈顶元素
  42. DataType GetTop(SqStack *stack) {
  43.     if (IsEmpty(stack)) {
  44.         printf("栈已空,无栈顶元素\n");
  45.         return '\0';
  46.     }
  47.     return stack->data[stack->top];
  48. }
  49. // 判断给定字符向量是否为回文
  50. int IsPalindrome(DataType *str) {
  51.     int len = strlen(str);
  52.    
  53.     SqStack stack;
  54.     InitStack(&stack);
  55.    
  56.     // 将前一半字符入栈
  57.     for (int i = 0; i < len / 2; i++) {
  58.         Push(&stack, str[i]);
  59.     }
  60.    
  61.     // 当字符个数为奇数时,跳过中间字符
  62.     if (len % 2 != 0) {
  63.         len++;
  64.     }
  65.    
  66.     // 判断后一半字符与栈中的字符是否相等
  67.     for (int i = len / 2; i < len; i++) {
  68.         if (str[i] != GetTop(&stack)) {
  69.             return 0;
  70.         }
  71.         Pop(&stack);
  72.     }
  73.    
  74.     return 1;
  75. }
  76. int main() {
  77.     DataType str[] = "abcddcba";
  78.    
  79.     if (IsPalindrome(str)) {
  80.         printf("给定字符向量是回文\n");
  81.     } else {
  82.         printf("给定字符向量不是回文\n");
  83.     }
  84.    
  85.     return 0;
  86. }
复制代码

这段代码中定义了一个结构体`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-4-28 02:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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