链式栈与链式队列相似,只是看成了在头结点插入,头结点删除 ,其核心是让相信节点指向头结点,头结点再指向新节点。
#include<iostream>
#include<Windows.h>
using namespace std;
#define MAX 50
typedef struct _node {
int date;
struct _node* next;
}LinkNode;
typedef LinkNode* StackPtr;
typedef struct LinkQ {
int length;
StackPtr top;
StackPtr base;
}LinkStack;
int init(LinkStack* LQ) {
if (!LQ) return 0;
LQ->length = 0;
LQ->top = LQ->base = NULL;
return 1;
}
int Isempty(LinkStack* LQ) {
if (!LQ) return 0;
if (LQ->top == NULL) {
return 1;
}
return 0;
}
int Isfull(LinkStack* LQ) {
if (!LQ) return 0;
if (LQ->length == MAX) {
return 1;
}
return 0;
}
int push(LinkStack* LQ, int e) {
if (!LQ) return 0;
LinkNode* tem = new LinkNode;//函数结束不会被释放,直到使用delete关键字
tem->date = e;
tem->next = NULL;
if (Isempty(LQ)) {
LQ->top = LQ->base = tem;
}
else {
tem->next = LQ->top;
LQ->top = tem;
}
LQ->length++;
return 1;
}
bool pop(LinkStack* LQ,int &e) {
if (!LQ) return false;
LinkNode* tem = new LinkNode;
if (Isempty(LQ)){
cout << "栈为空" << endl;
return false;
}
if (LQ->top == LQ->base) {
tem = LQ->top;
LQ->top = LQ->base= NULL;
}
else {
tem = LQ->top;
LQ->top = LQ->top->next;
}
e = tem->date;
delete tem;
LQ->length--;
return true;
}
bool print(LinkStack* LQ) {
if (!LQ) return false;
LinkNode* tem = new LinkNode;
if (Isfull(LQ)) {
cout << "栈为空" << endl;
return false;
}
while ((LQ->top)) {
cout << LQ->top->date << endl;
LQ->top = LQ->top->next;
}
return true;
}
int des(LinkStack* LQ) {
if (!LQ || Isempty(LQ)) {
cout << "栈为空" << endl;
return 0;
}
while (LQ->top) {
LinkNode* tep = LQ->top;
LQ->top = LQ->top->next;
delete tep;
tep = LQ->top;
}
LQ->base = NULL;
LQ->length = 0;
return 0;
}
int main() {
LinkStack* LQ = new LinkStack;
init(LQ);
for (int i = 0;i < 5;i++) {
push(LQ, i);
}
int e;
while (pop(LQ, e)) {
cout << e << endl;
}
system("pause");
return 0;
}