链式
#include<iostream>
using namespace std;
#define SElemType char
#define Status int
typedef char OperandType;
typedef struct SNode {
SElemType data;
SNode* next;
}SNode, * LinkStack;
Status InitStack(LinkStack& S)
{
S = (LinkStack)malloc(sizeof(SNode));
if (!S)
return 0;
S->next = NULL;
}
Status DestroyStack(LinkStack& S)
{
LinkStack p = S->next, ptmp;
while (p) {
ptmp = p->next;
free(p);
p = ptmp;
}
free(S);
return 1;
}
Status ClearStack(LinkStack& S)
{
LinkStack p = S->next, ptmp;
while (p) {
ptmp = p->next;
free(p);
p = ptmp;
}
S->next = NULL;
return 1;
}
Status StackEmpty(LinkStack& S)
{
return S->next == NULL;
}
int StackLength(LinkStack S)
{
int ans = 0;
LinkStack p = S->next;
while (p) {
ans++;
p = p->next;
}
return ans;
}
Status GetTop(LinkStack S, SElemType& e)
{
if (S->next == NULL)
return 0;
e = S->next->data;
return 1;
}
Status Push(LinkStack& S, SElemType e)
{
SNode* p = (SNode*)malloc(sizeof(SNode));
p->data = e;
p->next = S->next;
S->next = p;
return 1;
}
Status Pop(LinkStack& S, SElemType& e)
{
if (S->next == NULL)
return 0;
e = S->next->data;
SNode* p = S->next;
S->next = p->next;
free(p);
return 1;
}
Status visit(SElemType e)
{
cout << e << endl;
return 1;
}
Status StackTraverse(LinkStack S, Status(*visit)(SElemType))
{
if (S->next == NULL)
return 0;
for (int i = StackLength(S); i >= 1; i--)
{
LinkStack p = S->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
visit(p->data);
}
printf("\n");
return 1;
}
Status StackTreverse_Top(LinkStack S, Status(*visit)(SElemType))
{
if (S->next == NULL)
return 0;
LinkStack p = S->next;
while (p)
{
visit(p->data);
p = p->next;
}
printf("\n");
return 1;
}
int main()
{
return 0;
}