数据结构:栈

以下是完整代码:

/*
 * this file is an implementation of stack
 * file name: stack.c
 * author: John Woods
 * date: 2015/5/9
 * statement: anyone can use this file for any purpose
 */

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

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

typedef struct SNode {
    int value;
    struct SNode * next;
}* SNode;

typedef struct Stack {
    int depth;
    SNode top;
}* Stack;

/* operation declaration */
void stackInit(Stack * p_myStack);
void pop(Stack myStack);
void push(Stack myStack);
void stackClear(Stack myStack);
void stackDestroy(Stack * p_myStack);
BOOL isExist(Stack myStack);

/* menu */
void menu();

/* entrance: main function */
int main(void) {
    Stack myStack = NULL;
    int choice;
    char c;
    while(TRUE) {
        menu();
        while(!scanf("%d", &choice)) while(‘\n‘ != (c=getchar()) && EOF != c);
        switch(choice) {
            case 1:
                stackInit(&myStack);
                break;
            case 2:
                stackClear(myStack);
                break;
            case 3:
                push(myStack);
                break;
            case 4:
                pop(myStack);
                break;
            case 5:
                stackDestroy(&myStack);
                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 element   4.pop element  *\n");
    printf("\t*  5.destroy stack  6.exit         *\n");
    printf("\t****************MENU****************\n");
    printf("Your choice:");
}

/* operation implementation */
void stackInit(Stack * p_myStack) {
    if(isExist(*p_myStack)) {
        printf("This stack is already exist, cannot initial it!\n");
        return;
    }
    if(NULL == (*p_myStack = (Stack)malloc(sizeof(struct Stack)))) {
        printf("Out of memory!\n");
        return;
    }
    (*p_myStack)->top = NULL;
    (*p_myStack)->depth = 0;
    printf("Initial successfully!\n");
}

void pop(Stack myStack) {
    SNode pNode = NULL;
    int out;
    char c;
    if(!isExist(myStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    if(0 == myStack->depth) {
        printf("This stack is empty! Cannot pop the top value!\n");
        return;
    }
    while(TRUE) {
        out = myStack->top->value;
        pNode = myStack->top;
        myStack->top = myStack->top->next;
        myStack->depth--;
        free(pNode);
        pNode = NULL;
        printf("The value has been popped is %d\n", out);
        
        if(0 == myStack->depth) {
            printf("This stack is empty now, cannot continue popping!\n ");
            break;
        }

        while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Go on?(y/n):");
        if(‘y‘ != (c=getchar()) && ‘Y‘ != c) break;
    }
}

void push(Stack myStack) {
    SNode pNode = NULL;
    int value;
    char c;
    if(!isExist(myStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    while(TRUE) {
        if(!(pNode = (SNode)malloc(sizeof(struct SNode)))) {
            printf("Out of memory!\n");
            return;
        }
        printf("Please input the value:");
        while(!scanf("%d", &value)) while(‘\n‘ != (c=getchar()) && EOF != c);
        pNode->value = value;
        pNode->next = myStack->top;
        myStack->top = pNode;
        myStack->depth++;
        pNode = NULL;
        printf("Push successfully!\n");
    
        while(‘\n‘ != (c=getchar()) && EOF != c);
        printf("Go on?(y/n):");
        if(‘y‘ != (c=getchar()) && ‘Y‘ != c) break;
    }
}

void stackClear(Stack myStack) {
    if(!isExist(myStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    SNode pNode = NULL;
    while(myStack->top) {
        pNode = myStack->top;
        myStack->top = myStack->top->next;
        free(pNode);
    }
    myStack->top = NULL;
    myStack->depth = 0;
    printf("Clear successfully!\n");
}

void stackDestroy(Stack * p_myStack) {
    if(!isExist(*p_myStack)) {
        printf("This stack is not exist! Please initial it first!\n");
        return;
    }
    stackClear(*p_myStack);
    free(*p_myStack);
    *p_myStack = NULL;
    printf("Destroy successfully!\n");
}

BOOL isExist(Stack myStack) {
    if(NULL == myStack) return FALSE;
    else return TRUE;
}

这里想说的是typedef,typedef会“封装”出一个新的数据类型,与#define有很大的不同

/* typedef */
typedef struct SName{
    int data;
} * SName;
/* 若定义如下变量 */
SName temp = (SName)malloc(sizeof(struct SName));
/* 虽然 temp 实际上是个指针,但若当做参数被其它函数调用,其值仍是不会被修改的,在stack.c的stackInit()和stackDestroy()中传递参数要注意 */
时间: 2024-08-01 22:42:49

数据结构:栈的相关文章

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

poj 2082 Terrible Sets (数据结构 ——栈 STL)

 Terrible Sets Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2999   Accepted: 1549 Description Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all real numbers. wi, hi for i = 1 . . . n are some elem

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

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

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

数据结构-栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个顺序是否是该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但是4,3,5,1,2就不可能是. 分析:首先利用图像进行形象化的理解.可以发现其压入的顺序并不是所有的一次性压入.同时要考虑栈是否为空.以及其长度.这段代码写的很痛苦,继续训练. /* 剑指offer面试题22 */ #include <iostream> #include &

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

本段程序主要利用数据结构栈的先进后出特点,实现回溯求解迷宫路径问题. #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<

数据结构 栈笔记

// 数据结构 栈的实现 C语言, 只能从头部储存和销毁数据 # include <stdio.h> # include <stdlib.h> # include <malloc.h> // 线性储存部分 typedef struct NONE { int data; struct NONE * pNext; }None, * pNone; // 栈的头部和底部 typedef struct stack { pNone top; pNone bottom; }St, *

大话数据结构----栈

栈的定义: 栈(stack)是限定尽在表尾进行插入和删除操作的线性表. 从定义中可以看出,栈也是线性表,是一个特殊的线性表,之前说线性的表的时候,线性表可以在任意位置进行插入插入,而栈比线性表特殊的地方的就是不能随意的插入和删除了,栈的插入和删除只能在规定的同一端进行,而被允许插入和删除的一端称为栈顶,另一端称为栈底. 从栈的特性中我们能发现:1).栈是一种后进先出的线性表,因为栈只有一个出入口,每次出栈是最后进的那个先出去,后一个才能出去,就像我们出电梯一样,里面的人被阻住,只有外面的人出去,

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头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作