初始化等操作鏈棧的學習記錄
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
#include "iostream"
using namespace std;
#define OK 1
#define ERROR 0
typedef char SElemType;
//棧的鏈式儲存結構
typedef struct SNode {
SElemType data; //數據域
struct SNode *next; //指針域
}SNODE, *PSNODE;
//棧頂節點
typedef struct
{
PSNODE top; //棧頂指針
int count; //棧的長度
}LinkStack;
//初始化棧頂節點
int initStack(LinkStack *s) {
s->top = (PSNODE)malloc(sizeof(SNODE));
if (!s->top)
return ERROR;
s->top = NULL;
s->count = 0;
cout << "初始化鏈棧成功" << endl;
return OK;
}
//判斷棧是否爲空
int isStackEmpty(LinkStack *s) {
if (s->top == NULL)
{
return OK;
}
else {
return ERROR;
}
}
//輸出順序爲出棧的順序
int stackTraverse(LinkStack *s) {
int i;
if (isStackEmpty(s) == OK) return ERROR;
PSNODE p = s->top;
for (i = s->count; i>0; i--)
{
cout << p->data << endl;
p = p->next;
}
return OK;
}
//鏈棧元素入棧
int Push_LS(LinkStack *s, SElemType e) {
PSNODE p = (PSNODE)malloc(sizeof(SNODE));
if (!p) return ERROR;
p->data = e;
p->next = s->top; //新結點指向棧頂指針指向的地址
s->top = p; //更新棧頂指針
s->count++; // 節點增加1
return OK;
}
// 獲取棧頂元素
int GetTop(LinkStack *s, SElemType *e) {
if (isStackEmpty(s) == OK) return ERROR;
*e = s->top->data;
return OK;
}
//鏈棧元素出棧
int Pop_LS(LinkStack *s, SElemType *e) {
if (isStackEmpty(s) == OK) return ERROR;
PSNODE temp = s->top;
*e = temp->data;
s->top = temp->next;
s->count--;
free(temp);
return OK;
}
//銷燬棧
int clearStack(LinkStack *s) {
PSNODE p, q = NULL;
if (isStackEmpty(s) == OK) return ERROR;
p = s->top;
for (int i = s->count; i > 0; i--)
{
q = p->next;
free(p);
p = q;
}
s->count = 0;
cout << "釋放棧成功" << endl;
return OK;
}
int main() {
bool tagbool;
LinkStack s, *ls;
SElemType a, *e;
e = (SElemType*)malloc(sizeof(SElemType));
ls = &s;
//(1)初始化棧
initStack(ls);
int n;
//(2)判斷棧s是否爲空
tagbool = isStackEmpty(ls);
cout << "判斷棧是否爲空" << tagbool << endl;
//(3)以此進棧元素
cout << "插入元素abcde" << endl;
Push_LS(ls, 'a');
Push_LS(ls, 'b');
Push_LS(ls, 'c');
Push_LS(ls, 'd');
Push_LS(ls, 'e');
//(4)判斷棧s是否爲空
tagbool = isStackEmpty(ls);
cout << "判斷棧是否爲空" << tagbool << endl;
//(5)輸出出棧序列
cout << "輸出出棧序列" << endl;
stackTraverse(ls);
//(6)判斷棧s是否爲空
tagbool = isStackEmpty(ls);
cout << "判斷棧是否爲空" << tagbool << endl;
//(7)釋放棧
clearStack(ls);
return 0;
}