数据结构:栈(用数组实现)

以下是完整代码:

/*
 * this file if an implementation of stack with array list
 * file name: ArrayStack.c
 * author: John Woods
 * date: 2015/5/10
 * statement: anyone can use this file for any purpose
 */

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

#define INCREMENT 5
#define MAX_LEN 20

#define BOOL int
#define TRUE 1
#define FALSE 0

/* structure of the array stack */
typedef struct AStack {
    int Length;
    int MaxLength;
    int * StackArray;
}* AStack;

/* operation declaration */
void stackInit(AStack * p_myAStack);
void stackDestroy(AStack * p_myAStack);
void stackClear(AStack myAStack);
void pop(AStack myAStack);
void push(AStack myAStack);
BOOL isExist(AStack myAStack);

/* menu declaration */
void menu();

/* entrance: main function */
int main(void) {
    AStack myAStack = NULL;
    int choice;
    char c;
    while(TRUE) {
        menu();
        while(!scanf("%d", &choice)) while(‘\n‘ != (c=getchar()) && EOF != c);
        switch(choice) {
            case 1:
                stackInit(&myAStack);
                break;
            case 2:
                stackClear(myAStack);
                break;
            case 3:
                push(myAStack);
                break;
            case 4:
                pop(myAStack);
                break;
            case 5:
                stackDestroy(&myAStack);
                break;
            default:
                exit(EXIT_SUCCESS);
                break;
        }
    }
    return 0;
}

/* menu implementation */
void menu() {
    printf("\n\t***************MENU***************\n");
    printf("\t* 1.initial stack  2.clear stack *\n");
    printf("\t* 3.push           4.pop         *\n");
    printf("\t* 5.destroy stack  6.exit        *\n");
    printf("\t***************MENU***************\n");
    printf("\tYour choice: ");
}

/* operation implementation */
void stackInit(AStack * p_myAStack) {
    if(isExist(*p_myAStack)) {
        printf("This stack is already exist! Please destroy it first!\n");
        return;
    }
    *p_myAStack = (AStack)malloc(sizeof(struct AStack));
    if(NULL == *p_myAStack) {
        printf("Out memory! Initial unsuccessfully!\n");
        return;
    }
    (*p_myAStack)->StackArray = (int *)malloc(sizeof(int) * MAX_LEN);
    if(NULL == (*p_myAStack)->StackArray) {
        printf("Out memory! Initial unsuccessfully!\n");
        printf("Destroy the stack now...\n");
        stackDestroy(p_myAStack);
        return;
    }
    (*p_myAStack)->Length = 0;
    (*p_myAStack)->MaxLength = MAX_LEN;
    printf("Initial successfully!\n");
}

void stackDestroy(AStack * p_myAStack) {
    if(!isExist(*p_myAStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    free((*p_myAStack)->StackArray);
    free(*p_myAStack);
    *p_myAStack = NULL;
    printf("Destroy successfully!\n");
}

void stackClear(AStack myAStack) {
    if(!isExist(myAStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    myAStack->Length = 0;
    printf("Clear successfully!\n");
}

void pop(AStack myAStack) {
    int value;
    char c;
    if(!isExist(myAStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    while(TRUE) {
        if(0 == myAStack->Length) {
            printf("This stack has no element! Pop unsuccessfully!\n");
            return;
        }
        value = *(myAStack->StackArray + myAStack->Length - 1);
        myAStack->Length--;
        printf("Pop successfully! The popped value is %d\n", value);
        
        
        while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Go on?(y/n) ");
        if(‘y‘ != (c=getchar()) && ‘Y‘ != c) break;
    }
}

void push(AStack myAStack) {
    int value;
    char c;
    if(!isExist(myAStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    while(TRUE) {
        if(myAStack->Length >= myAStack->MaxLength) {
            if(NULL == (myAStack = (AStack)realloc(myAStack, sizeof(int) * INCREMENT))) {
                printf("Out of memory! Push unsuccessfully!\n");
                return;
            }
            myAStack->MaxLength += INCREMENT;
        }
        printf("Please input value:");
        while(!scanf("%d", &value)) while(‘\n‘ != (c=getchar()) && EOF != c);
        *(myAStack->StackArray + myAStack->Length) = value;
        myAStack->Length++;
        printf("Push successfully! The pushed value is %d\n", value);
    
        while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Go on?(y/n) ");
        if(‘y‘ != (c=getchar()) && ‘Y‘ != c) break;
    }
}

BOOL isExist(AStack myAStack) {
    if(NULL == myAStack) return FALSE;
    else return TRUE;
}

PS:今天是母亲节哦!

时间: 2024-07-30 21:44:26

数据结构:栈(用数组实现)的相关文章

数据结构—栈

先说什么是栈: 1.后进先出  2.对数据的所有操作只能在固定的一端进行操作,不能再中间或者另一端对数据进行操作. 符合以上两点的 存储数据的类(对象) 叫做栈. 需要说明的是:栈是符合以上两个特性的所有的数据结构都可以叫做栈,无论其用什么基本容器实现的. 再说如何实现: 可以使用数组或者链表实现栈,在用链表实现的时候要屏蔽掉链表的一些特性:在链表中间对数据进行操作等. 看一下jdk中自带的栈: 注意Stack(图一)中:  Stack继承自Vactor     Stack自己的方法种类 Vec

数据结构——栈——寻找下一个较大元素

题目描述 给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1 举例 {4,6,1,3,2,5} 则求得的答案应为 {6,-1,3,5,5,-1} 题目分析 首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了.时间复杂度应该是n^2 但是这样肯定是不够用的. 然后我们考虑,这道题我们实际上遇到的问题是什么? 其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值. 难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大

利用数据结构栈求解迷宫问题

本段程序主要利用数据结构栈的先进后出特点,实现回溯求解迷宫路径问题. #include<iostream> #include<stack> using namespace std; //坐标类 struct Point { int x; int y; }; //地图类 template<int A> struct Map { int (*p)[A]; int row;//行数 int col;//列数 }; //start起始点, end终止点 template<

当数据结构遇到编程语言——数组

赵振江 数据结构 数组 一维数组 "数组"你真的很了解吗? 数组大家都不是很陌生,它已经"植入"了许多编程语言,但初学者一提到数组,可能不会联想到"数据结构",而是想到的会是一种"数据类型",数组本质上就是一种极其简单的数据结构.所谓数组,就是相同数据类型的元素按一定顺序排列的集合.也就是在内存中划分一段连续的且大小固定(注意是连续)的内存空间(或者其他存储器)保存相同数据类型的数据,如下图.一般说的简单数组,都是静态的数组,

java数据结构栈

栈的原则是先进后出,比如一堆摞起来的书,后放上去的会被最先拿到. 栈的特点是每次只允许访问一个元素. 栈是一种抽象出来的数据结构,它的底层存储依赖于数组和链表,下面列出它的两种实现 public interface Stack <T>{ boolean isEmpty(); void clear(); int length(); boolean push(T obj); T pop(); boolean hashNext(); } public class ArrayStack<T>

数据结构-栈的实现之括号匹配检测

假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先检测栈是否为空, 若栈空则表明此右括弧多余,表达式不匹配. 否则和栈顶数据比较,若匹配则栈顶出栈. 否则表明表达式不匹配: 最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配. 实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作

基本数据结构-栈的实现及其运用

概述:数据结构是用来实现动态集合的方式.动态集合有两个要素,一是动态集合中的元素,二是动态集合上的操作如search(s,k):其中s为给定的集合,k为所要查询的关键字.Insert(s,k),delete,maximun,minimum,successor,predecessor等. 这里介绍几种简单的数据结构:栈,队列,链表,有根树. 一.栈 栈有一定限制的表,元素的插入和删除只能在表头进行,栈虽然缺少鲁棒性,但是更有效,并且很容易应用,栈后进先出.基本的操作包括进栈PUSH,出栈pop,判

数据结构——栈的类定义和实现

#include<iostream> #include<iomanip> #include<string> #include<stdlib.h> //使用库函数exit() using namespace std; template<class Type> class Stack{ private: Type*data; //栈元素数组 int maxSize; //最大栈顶值 int top; //栈顶 public: void setStac

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

基本数据结构 -- 栈详解

栈是一种后进先出的线性表,是最基本的一种数据结构,在许多地方都有应用. 一.什么是栈 栈是限制插入和删除只能在一个位置上进行的线性表.其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom).对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素).栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素.栈就像是一个箱子,往里面放入一个小盒子就相当于