tangpeng04 发表于 2023-12-6 20:35:15

顺序栈的操作

顺序栈的操作
【实验要求】
(1) 建立含有若干个元素的顺序栈;
(2) 对已建立的顺序栈进行插入、删除、取栈顶元素等基本操作。
【实验提示】
首先定义顺序栈的数据类型 SqStack;对于题目要求的插入、删除、取栈顶
元素等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序栈的元
素。

FishC_GPT 发表于 2023-12-6 20:36:09

下面是一个简单的顺序栈的实现,包含了插入、删除和取栈顶元素等基本操作:

#include <stdio.h>
#define MAXSIZE 100

typedef struct {
    int data;
    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;
}

// 输出栈的元素
void PrintStack(SqStack *stack) {
    if (IsEmpty(stack)) {
      printf("栈为空\n");
      return;
    }
    printf("栈的元素为:");
    for (int i = 0; i <= stack->top; i++) {
      printf("%d ", stack->data);
    }
    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官方接口),如未能正确解答您的问题,请继续追问。

tangpeng04 发表于 2023-12-6 20:44:02

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



说明整段代码的思路和求出时间复杂度

FishC_GPT 发表于 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官方接口),如未能正确解答您的问题,请继续追问。

tangpeng04 发表于 2023-12-6 20:58:18

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

【实验要求】
请写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
#define StackSize 100 //假定预分配的栈空间最多为 100 个元素
typedef char DataType;//假定栈元素的数据类型为字符
代码注释详细点

FishC_GPT 发表于 2023-12-6 21:04:32

tangpeng04 发表于 2023-12-06 20:58
【实验要求】
请写一个算法判定给定的字符向量是否为 ...

下面是一个判断给定字符向量是否为回文的算法实现:

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

#define StackSize 100

typedef char DataType;

typedef struct {
    DataType data;
    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 = 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;
}

// 判断给定字符向量是否为回文
int IsPalindrome(DataType *str) {
    int len = strlen(str);
   
    SqStack stack;
    InitStack(&stack);
   
    // 将前一半字符入栈
    for (int i = 0; i < len / 2; i++) {
      Push(&stack, str);
    }
   
    // 当字符个数为奇数时,跳过中间字符
    if (len % 2 != 0) {
      len++;
    }
   
    // 判断后一半字符与栈中的字符是否相等
    for (int i = len / 2; i < len; i++) {
      if (str != 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官方接口),如未能正确解答您的问题,请继续追问。

tangpeng04 发表于 2023-12-6 21:11:38

FishC_GPT 发表于 2023-12-6 21:04
下面是一个判断给定字符向量是否为回文的算法实现:



字符串由用户输入,时间复杂度分析详细一点

FishC_GPT 发表于 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官方接口),如未能正确解答您的问题,请继续追问。

tangpeng04 发表于 2023-12-6 21:17:36

FishC_GPT 发表于 2023-12-6 21:12
如果字符串长度为n,则时间复杂度分析如下:

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

用两个顺序栈实现一个共享栈,具体要求为:设有两个栈都采用顺序栈方式,共
享一个存储区,,采用栈顶相向,迎面增长的存储方式,设计
出栈和入栈等操作算法
页: [1]
查看完整版本: 顺序栈的操作