#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int Elemtype;
typedef struct Node {
Node *lNext;
Elemtype eData;
} *LinkedStack;
//
LinkedStack initNode();
void showStack(LinkedStack);
void initStack(LinkedStack , int);
int stackLength(LinkedStack);
bool isEmptyStack(LinkedStack);
Elemtype getTop(LinkedStack);
void push(LinkedStack , Elemtype);
Elemtype pop(LinkedStack);
void clearStack(LinkedStack);
int main()
{
LinkedStack ls = initNode();
cout << " :" << endl;
int iSize;
cin >> iSize;
cout << " :" << endl;
initStack(ls , iSize);
cout << " :" << endl;
showStack(ls);
//
//cout << " :" << stackLength(ls) << endl;
//
/*bool bEmpty = isEmptyStack(ls);
if(bEmpty) {
cout << " !" << endl;
} else {
cout << " !" << endl;
}*/
//
/*Elemtype eReturn = getTop(ls);
cout << " :" << eReturn << endl;*/
//
/*Elemtype eValue;
cout << " :" << endl;
cin >> eValue;
push(ls , eValue);
cout << " , :" << endl;
showStack(ls);*/
//
Elemtype eDelete = pop(ls);
cout << " :" << eDelete << endl;
cout << " :" << endl;
showStack(ls);
//
cout << " ……" << endl;
clearStack(ls);
showStack(ls);
return 0;
}
//
LinkedStack initNode() {
LinkedStack lReturn = (LinkedStack)malloc(sizeof(Node));
lReturn->lNext = NULL;
return lReturn;
}
//
void initStack(LinkedStack lHead , int iSize) {
if(lHead->lNext != NULL) {
lHead->lNext = NULL;
}
for(int i = 0; i < iSize; i++) {
Elemtype eValue;
cin >> eValue;
push(lHead , eValue);
}
}
//
int stackLength(LinkedStack lHead) {
int length = 0;
while(lHead->lNext != NULL) {
length++;
lHead = lHead->lNext;
}
return length;
}
//
void showStack(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
cout << " !" << endl;
return;
}
lHead = lHead->lNext;
while(lHead != NULL) {
cout << lHead->eData << " ";
lHead = lHead->lNext;
}
cout << endl;
}
//
bool isEmptyStack(LinkedStack lHead) {
if(lHead->lNext == NULL) {
return true;
}
return false;
}
//
Elemtype getTop(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
cout << " !" << endl;
return -1;
}
return lHead->lNext->eData;
}
//
void push(LinkedStack lHead , Elemtype eValue) {
LinkedStack lNew = initNode();
lNew->eData = eValue;
lNew->lNext = lHead->lNext;
lHead->lNext = lNew;
}
//
Elemtype pop(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
cout << " !" << endl;
return -1;
}
LinkedStack lDelete = lHead->lNext;
lHead->lNext = lDelete->lNext;
Elemtype eReturn = lDelete->eData;
free(lDelete);
return eReturn;
}
//
void clearStack(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
return;
}
while(!isEmptyStack(lHead)) {
LinkedStack lDelete = lHead->lNext;
lHead->lNext = lDelete->lNext;
free(lDelete);
}
}
//
void destoryStack(LinkedStack lHead) {
clearStack(lHead);
free(lHead);
}