栈
栈是一种特殊的线性表
只能在表尾进行插入和删除操作的线性表
栈有两种存储结构:顺序存储和链式存储
先进后出/后进先出
栈的链式存储结构
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 0
typedef 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;
}