数据结构_栈

来源:互联网 发布:java识别屏幕数字 编辑:程序博客网 时间:2024/06/10 17:43

栈是一种特殊的线性表
只能在表尾进行插入和删除操作的线性表
栈有两种存储结构:顺序存储和链式存储
先进后出/后进先出

栈的链式存储结构

typedef struct StackNode{    ElemType data;  //存放数据    struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack {    LinkStackPtr top;   //栈顶指针    int count;  //元素个数};

进栈(Push)
头插法将数据插在表头,即栈顶

//push 入栈Status Push(LinkStack* s, ElemType e) {    LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));   //分配内存    p->data = e;    p->next = s->top;    s->top = p;    s->count++;    return OK;}

出栈(Pop)
输出栈顶元素并删除该结点

//pop 出栈,并删除栈顶结点Status Pop(LinkStack*s, ElemType *e) {    LinkStackPtr p;    if (StackEmpty(s)) {        cout << "栈空" << endl;        return ERROR;    }    p = s->top;    s->top = p->next;    *e = p->data;    free(p);    s->count--;    return OK;}

栈空

Status StackEmpty(LinkStack* s) {//栈空    if (s->count == 0) {        return TRUE;    }    else        return FALSE;}

完整代码

/*链式栈的相关操作*/#include <iostream>using namespace std;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int ElemType;typedef int Status;typedef struct StackNode{    ElemType data;  //存放数据    struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack {    LinkStackPtr top;   //栈顶指针    int count;  //元素个数};Status StackEmpty(LinkStack* s) {//栈空    if (s->count == 0) {        return TRUE;    }    else        return FALSE;}//push 入栈Status Push(LinkStack* s, ElemType e) {    LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));   //分配内存    p->data = e;    p->next = s->top;    s->top = p;    s->count++;    return OK;}//pop 出栈,并删除栈顶结点Status Pop(LinkStack*s, ElemType *e) {    LinkStackPtr p;    if (StackEmpty(s)) {        cout << "栈空" << endl;        return ERROR;    }    p = s->top;    s->top = p->next;    *e = p->data;    free(p);    s->count--;    return OK;}int main(){    LinkStack* l = (LinkStack*)malloc(sizeof(LinkStack));    l->count = 0;    while (true)  {        cout << "栈的基本操作" << endl;        cout << "1.入栈" << endl;        cout << "2.出栈" << endl;        cout << "0.退出" << endl;        int op;        cin >> op;        switch (op)        {        case 1:            cout << "请输入入栈的数据,输入-1即结束" << endl;            int n;            cin >> n;            while (n != -1) {                Push(l, n);                cin >> n;            }            break;        case 2:            cout << "出栈:";            int m;            while (l->count > 0) {                Pop(l, &m);                cout << m << " ";            }            cout << endl;        case 0:            cout << "再见!" << endl;            return 0;        default:            break;        }    }    return 0;}

栈的顺序存储结构

原创粉丝点击