数据结构--栈

本文介绍了栈和队列的基本概念,操作原则,以及它们在括号匹配、数据结构中的应用。详细讲解了顺序存储结构栈的初始化、空检查、入栈出栈方法,并举例展示了如何用顺序栈实现十进制转r进制。同时提到了链式存储结构的栈实现方式。
摘要由CSDN通过智能技术生成

栈和队列是限定插入和删除操作的只能在表的 “端点” 进行的特殊的线性表。

一、栈

操作原则:先进后出(后进先出)

栈的应用:

引入:

可以利用一个栈结构保存每个出现的左括号,当遇到右括号时,从栈中弹出左括号,检验匹配情况。

检验过程中,遇到以下情况之一可得出括号不匹配的结论:

(1)当遇到某一个右括号时,栈已空,说明到目前为止,右括号多于左括号

(2)从栈中弹出的左括号与当前检验的右括号类型不同,说明出现了括号交叉情况。

(3)算术表达式输入完毕,但栈中还有没有匹配的左括号,说明左括号多于右括号。



1.栈的抽象数据类型

具体操作 :

2.栈的顺序存储结构及实现

操作:
1.初始化栈
typedef struct {
    int top;
} SqStack;

void init(SqStack s) {
    s.top = -1;
}

int main() {
    SqStack stack;
    stack.top = 0;

    init(stack);
    printf("%d\n", stack.top);  // 输出结果为0,未被修改

    return 0;
}

正确方法:

void init(SqStack *s) {
    s->top = -1;
}

int main() {
    SqStack stack;
 
    init(&stack);
    printf("%d\n", stack.top);  // 输出结果为-1,已经被初始化
 
    return 0;
}

2.测试栈是否为空、是否已满(不需要修改原始数据)

3.入栈和出栈
#include <stdio.h>
#define M (1000+5)
typedef char ElemType;
typedef struct {
    ElemType data[M];
    int top;
} SqStack;

void push(SqStack* S, ElemType x) {//入栈操作
    if (S->top < M - 1) {
        S->top++;
        S->data[S->top] = x;
    }
    else {
        printf("overflow!");
    }
}

ElemType pop(SqStack* S) {//出栈操作
    if (S->top == -1) {
        printf("Underflow");
        return -1;
    }
    else {
        ElemType x = S->data[S->top];
        S->top--;
        return x;
    }
}

int main() {
    SqStack stack;
    stack.top = -1;//初始化栈

    push(&stack, 'a');
    push(&stack, 'b');
    push(&stack, 'c');

    for (int i = stack.top; i >= 0; i--) {
        printf("%c ", stack.data[i]);
    }
    printf("\n");

    while (stack.top != -1) {
        ElemType x = pop(&stack);
        printf("Pop: %c\n", x);
    }

    return 0;
}

如果Top初始值为1

要注意出栈和入栈时,是指针先移动还是元素先动!!

bool Push (Stack S,ElementType x)
{
    if(S->Top==S->MaxSize){
        printf("Stack Full\n");
        return false;
    }
    else{
        S->Data[S->Top]=x;
        S->Top++;
        return true;
    }
}


ElementType Pop(Stack S)
{
       if(S->Top==0){
    printf("Stack Empty\n");
           return ERROR;
       }
    else{
        S->Top--;
        ElementType x=S->Data[S->Top];
        return x;
     }

} 
例题:利用顺序栈实现十进制转r进制。输入2个自然数n和r,输出转换后的r进制数。测试数据有多组,处理到输入结束。

#include <stdio.h>
#define M (1000+5)
typedef char ElemType;
typedef struct {
    ElemType data[M];
    int top;
} SqStack;

void push(SqStack* S, ElemType x) {//入栈操作
    if (S->top < M - 1) {
        S->top++;
        S->data[S->top] = x;
    }
    else {
        printf("overflow!");
    }
}

ElemType pop(SqStack* S) {//出栈操作
    if (S->top == -1) {
        printf("Underflow");
        return -1;
    }
    else {
        ElemType x = S->data[S->top];
        S->top--;
        return x;
    }
}

void decimalToR(int n, int r) {
    SqStack stack;
    stack.top = -1;//栈的初始化

    while (n > 0) {
        int remainder = n % r;
        if (remainder < 10) {
            push(&stack, '0' + remainder);
        }
        else {
            push(&stack, 'A' + remainder - 10);
        }
        n =n / r;
    }

    while (stack.top != -1) {
        printf("%c", pop(&stack));
    }
    printf("\n");
}

int main() {
    int n, r;
    while (scanf("%d %d", &n, &r) != EOF) {
        decimalToR(n, r);
    }

    return 0;
}

类似的题:

**顺序栈的实现不需要创建动态数组空间,而是通过事先分配一个固定大小的数组来存储栈中的元素。

3.栈的链式存储结构及实现

操作:

1.初始化栈

2.测试栈是否为空

3.入栈和出栈

4.取栈顶元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值