链式栈
#include<iostream>
typedef struct Linknode {
int data;
Linknode* next;
}*LiStack;
bool InitStack(LiStack& s) // 使用引用
{
s = new Linknode;
if (s == NULL)
return false;
s->next = NULL;
return true;
}
bool StackEmpty(LiStack s)
{
return s->next == NULL;
}
bool Push(LiStack& s, int x)
{
if (s == NULL) // 这里实际上在正确初始化的栈上不需要,但保持检查是个好习惯
return false;
Linknode* L = new Linknode;
L->data = x;
L->next = s->next;
s->next = L;
return true;
}
bool Pop(LiStack& s, int& x)
{
if (StackEmpty(s)) // 检查栈是否为空
return false;
Linknode* q = s->next;
x = q->data;
s->next = q->next;
delete q;
return true;
}
bool GetTop(LiStack s, int& x)
{
if (StackEmpty(s))
return false;
Linknode* q = s->next;
x = q->data;
return true;
}
int main()
{
LiStack s;
if (InitStack(s)) {
std::cout << "Stack initialized successfully." << std::endl;
Push(s, 10);
Push(s, 20);
int top;
if (GetTop(s, top)) {
std::cout << "Top element is: " << top << std::endl;
}
Pop(s, top);
std::cout << "Popped element is: " << top << std::endl;
} else {
std::cout << "Stack initialization failed." << std::endl;
}
// 释放栈内存(在这里只是栈底节点,因为其他节点在Pop时被释放了)
delete s;
return 0;
}