C语言 java 实现 数据结构栈的顺序存储

这篇博客展示了如何使用C++和Java实现栈的基本操作,包括初始化、判断栈空、栈满、入栈、退栈,并应用于括号匹配检查、字符串回文判断和数制转换。通过实例代码详细解释了每个操作的实现过程,帮助读者理解栈在实际问题中的运用。
摘要由CSDN通过智能技术生成

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

#define StackSize 100
typedef char DataType;
typedef struct {
    DataType data[StackSize];
    int top;
}SeqStack;

SeqStack s;

//置空栈
void InitStack(SeqStack *s) {
    s->top = -1;
}

//判栈空
int StackEmpty(SeqStack* s) {

    return s->top == -1;
}

//判栈满
int StackFull(SeqStack* s) {

    return s->top == StackSize-1;
}

//入栈
void Push(SeqStack* s,DataType x) {
    if (StackFull(s)){
        printf("stack overflow");
        exit(0);
    }else{
        s->data[++s->top] = x;
    }
}

//退栈
DataType Pop(SeqStack* s) {
    if (StackEmpty(s)){
        printf("stack underflow");
        exit(0);
    }else{
        return s->data[s->top--];
    }
}

应用

//圆括号检验
int Expr() {
    SeqStack S;
    DataType ch, x;
    InitStack(&S);
    ch = getchar();
    while (ch != '\n') {
        if (ch == '(') {
            Push(&S,ch);
        }else{
            if (ch == ')') {
                if (StackEmpty(&S)){
                    return 0;
                }else {
                    Pop(&S);
                }
        
            }
        }

        ch = getchar();
    }
    if (StackEmpty(&S)){
        return 1;
    }else {
        return 0;
    }

}
//字符串回文判断
int symmetry(char str[],int size) {
    SeqStack S;
    int j, k, i = 0;
    InitStack(&S);
    i = 8;
    for (j = 0; j < i / 2;j++) {
        Push(&S, str[j]);
    }
    k = (i + 1) / 2;
    for (j = k; j < i;j++) {
        if (str[j] != Pop(&S)) {
            return 0;
        }
    }
    return 1;
}
//数制转换
void conversion(int N,int d) {
    SeqStack S;
    InitStack(&S);
    while (N) {
        Push(&S, N % d);
        N = N / d;
    }
    while (!StackEmpty(&S)) {
        printf("%d", Pop(&S));
    }

}


int main() {

    //圆括号匹配检验
    /*if (Expr()==1) {
        printf("圆括号匹配");
    }else{
        printf("圆括号不匹配");
    }*/
    /*char str[8] = { 'a','b','a','b','b','a','b','a' };
    if (symmetry(str,8) ==1) {
        printf("是字符串回文");
    }else{
        printf("不是字符串回文");
    }*/

    //数制转换

    conversion(1348, 8);
    
    
}

 

 

 

################java 版

package stack;

import java.util.Scanner;

/**
 * @Date: 2021/1/27 11:32
 */
public class Stack {
    public static Integer stackSize = 100;
    private Object data[] = new Object[stackSize];
    private Integer top;

    public Stack() {
        this.top = -1;
    }

    public Object[] getData() {
        return data;
    }

    public void setData(Object[] data) {
        this.data = data;
    }

    public Integer getTop() {
        return top;
    }

    public void setTop(Integer top) {
        this.top = top;
    }


    //置空栈
    public void initStack(Stack stack) {
        stack.setTop(-1);
    }

    //判栈空
    public boolean stackEmpty(Stack stack) {
        return stack.getTop() == -1;
    }

    //判栈满
    public boolean stackFull(Stack stack) {
        return stack.getTop() == stackSize - 1;
    }

    //入栈
    public void push(Stack stack, Object object) throws Exception {
        if (stackFull(stack)) {
            throw new Exception("stock overflow");
        }
        Integer top = getTop();
        stack.data[++top] = object;
        stack.setTop(top);
    }

    public Object pop(Stack stack) throws Exception {
        if (stackEmpty(stack)) {
            throw new Exception("stock underflow");
        }
        Integer top = getTop();
        Object object = stack.data[top];
        stack.setTop(--top);
        return object;
    }

    public Object getTop(Stack stack)throws Exception{
        if (stackEmpty(stack)) {
            throw new Exception("stock underflow");
        }
        return stack.data[top];
    }

    public int expr() throws Exception {
        Stack stack = new Stack();
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] c = str.split("");
        for (String s : c) {
            if (s.equals("(")) {
                stack.push(stack, s);
            } else {
                if (s.equals(")")) {
                    if (stackEmpty(stack)) {
                        return 0;
                    } else {
                        stack.pop(stack);
                    }
                }
            }
        }
        if (stackEmpty(stack)) {
            return 1;
        }
        return 0;
    }

    //判断字符串字符串对称
    public int symmetry(Stack stack ,String[] str) throws Exception {
        int size = 0;
        for(String d:str){
            ++size;
        }

        int i = 0;
        for (i = 0; i < size / 2; i++) {
            stack.push(stack, str[i]);
        }
        if (size % 2 != 0) {
            i++;
        }
        while (!pop(stack).equals(str[i++])){
            return 0;
        }
        return 1;
    }

    //数制转换
    public void conversion(Stack stack, int num, int d) throws Exception {
        while (num >=d) {
            stack.push(stack, num % d);
            num = num / d;
        }
        stack.push(stack, num );
    }


    public static void main(String[] args) throws Exception {
        Stack stack = new Stack();
        stack.conversion(stack,1348,8);



       /* String[] str = {"a", "b", "c","e","b", "a"};
        int a = stack.symmetry(stack, str);
        if (a == 1){
            System.out.println("对称");
        }else {
            System.out.println("不对称");
        }*/
    }

}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值