栈的基本操作

这个栈是带有表头的栈。实现栈的一些规范操作,初始化,插入,删除等。包括两个头文件Stack.h,fatal.h,库函数Stack.c,测试函数TestStack.c。头文件放的都是函数声明,库函数Stack.c放的的函数的定义。

Stack.h

typedef int ElementType;
#ifndef _Stack_H
#include<stdbool.h>
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

bool IsEmpty(Stack S);//判断栈是否为空
Stack CreatStack(void);//初始化一个栈
void Pop(Stack S);//对栈进行删除工作,只能弹出栈顶元素
void MakeEmpty(Stack S);//使得一个栈制空
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void DisposeStack(Stack S);
void PrintStake(Stack S);
#endif // !_Stack_H

fatal.h

#include<stdio.h>
#include<stdlib.h>
#define Error(Str) FatalError(Str)
#define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1);

Stack.c

#include "Stack.h"
#include<stdlib.h>
#include<stdio.h>
#include"fatal.h"
//结构体定义
struct Node
{
    ElementType Element;
    PtrToNode Next;
};

bool IsEmpty(Stack S)
{
    return S->Next == NULL;
}

//初始化一个栈
Stack CreatStack(void)
{
    Stack S;
    S = malloc(sizeof(struct Node));
    if (S == NULL) FatalError("Out of Space!")
    S->Next = NULL;
    MakeEmpty(S);//保证栈是个空栈
    return S;
}

//对栈进行删除工作,只能删除顶部元素
void Pop(Stack S)
{
    PtrToNode FirstCell;
    if (IsEmpty(S))
        Error("Empty Stack!")
    else
    {
        FirstCell = S->Next;
        S->Next = S->Next->Next;
        free(FirstCell);
    }
}

//使得一个栈制空
void MakeEmpty(Stack S)
{
    if (S==NULL)
        Error("Must use CreatStake first")
    else
    {
        while (!IsEmpty(S))
            Pop(S);
    }
}

//往栈S添加一个元素X
void Push(ElementType X, Stack S)
{
    PtrToNode TmpCell;
    TmpCell = malloc(sizeof(struct Node));
    if (TmpCell==NULL) FatalError("Out of Space!")
    else
    {
        TmpCell->Element = X;
        TmpCell->Next = S->Next;
        S->Next = TmpCell;
    }
}

ElementType Top(Stack S)
{
    if (!IsEmpty(S)) return S->Next->Element;
    Error("Empty Space");
    return  0;/*Return value used to avoid warning*/
}

void DisposeStack(Stack S)
{
    MakeEmpty(S);
    free(S);
}

//打印栈,栈也没了
void PrintStake(Stack S)
{
    while (!IsEmpty(S))
    {
        printf("%d ", Top(S));
        Pop(S);
    }
}

TestStack.c

#include "Stack.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    Stack S;
    S = CreatStack();
    printf("随机生成多少位数:");
    long  amount;
    scanf_s("%d", &amount);
    srand((unsigned)time(NULL));
    for (long i = 0; i < amount; i++)
        Push(rand() % 1000,S);//插入元素
    PrintStake(S);
    DisposeStack(S);//释放栈
}

时间: 2024-10-19 06:30:35

栈的基本操作的相关文章

3_顺序栈的基本操作

/****date:2014.12.08*****/ /***顺序栈的基本操作***/ /*** Last in First out ( LIFO ) ***/ 顺序栈:使用地址连续的内存单元依次保存栈中的数据,可以定义一个指定大小的结构数组来作为栈:栈底元素序号为0,栈顶元素序号为Top: 栈内元素遵循"后进先出"(LIFO)原则:只能在栈的一端进行操作,即在栈顶位置对栈内元素进行操作. 刚明白的道理:getchar() 对于 键盘的所有操作都算在内,敲击  回车键  也算一个输入信

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

链栈的基本操作

链栈的基本操作实现代码如下: #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 //链栈的结构 typedef struct node { int data; struct node *next; }LinkStackNode; typedef LinkStackNode *LinkStack; //链栈进栈 int Push(LinkStack top, int x)//将数据元素x压入栈top中 {

栈的基本操作( too simple)

栈的基本操作: 1,存储结构: 2,创建空战: 3,获取栈顶元素:(判空) 4,插入和删除: 5,销毁栈: # define stack_init_size 100 # define stackincrement 10 typedef int SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; void DestoryStack(SqStack &S) { S.top=S.ba

栈的基本操作—出栈与入栈

#include<stdio.h> #include<stdlib.h> #define LENGTH 100 //初始分配栈的长度 #define ADD_LEN 10 //栈长增量 typedef struct {//构造栈的数据类型 int *base; int *top; int stacksize; }SqStack; void CreateStack(SqStack &S);//初始化一个栈 void PushStack(SqStack &S,int e

栈(一)——栈的基本操作

1.栈的简介 栈是一种后入先出的数据结构,一般包含两种最基本的操作:入栈(push)和出栈(pop). 入栈操作:top指针上移,元素入栈. 出栈操作:top指针下移. 栈空的条件:top == bottom 栈满的条件:top == maxsize-1 2.有数据序列1 2 3一次存入一个栈stack中,则出栈顺序可以为以下四种: 1,2,3: 2,1,3: 3,2,1: 1,3,2. 3.任意输入一个十进制整数x(x<32768),输出x的二进制值. #include <stdio.h&g

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

【数据结构】C语言栈的基本操作

#include<stdio.h> #include<stdlib.h> #include<malloc.h> //定义节点 struct Node { int data; struct Node *next; }; typedef Node StackNode; //定义栈 struct Stack { StackNode *top; StackNode *base; }; typedef Stack SqStack; //定义创建栈的函数 int InitStack

《栈的基本操作》

/* 对栈的一些基本操作: 1,栈的创建. CreatStack(SqStack &s) 2,压栈操作. Push(SqStack &s,SElemType &e) 3,得到栈顶的元素. GetTop(SqStack s,SElemType &e) 4,出栈操作.(若栈不为空,则删除栈顶元素,并用e2返回其值) Pop(SqStack &s,SElemType &e) 5,计算栈的长度. StackLength(SqStack s) 6,清空一个栈. Cle

C++实现链栈的基本操作

之前对顺序栈写了基本操作,觉得有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义如下: #ifndef CSTOCK_H_ #define CSTOCK_H_ typedef int elemType; struct Item { elemType data; Item * p_next; }; class CStock { public: CStock(); CStock(const CStock & otherStock); //拷贝构造函数: CStock