棧-鏈式儲存結構-c語言
阿新 • • 發佈:2019-02-06
/*
棧 鏈式儲存結構實現
第一個結構體是每一個節點元素, 類似於連結串列
第二個結構體是用個指標top指向連結串列的尾部
*/
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
typedef struct StackNode{
SElemType data;
struct StackNode *next;
} StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top;
int count;
} LinkStack;
//初始化棧
Status initStack(LinkStack *S){
LinkStackPtr p;
p = (LinkStackPtr)malloc(sizeof(StackNode));
p->next = NULL;
S->top = p;
S->count = 0;
return OK;
}
//判斷棧是否為空
Status StackEmpty(LinkStack S){
if (S.count == 0){
return OK; //為null
}else{
return ERROR;
}
}
//入棧 插入元素e
Status push(LinkStack *S, SElemType e){
LinkStackPtr s = (LinkStackPtr) malloc (sizeof(StackNode)); //生成一個節點
s->data = e;
s->next = S->top; //把當前的棧頂元素值賦給新節點的直接後繼
S->top = s; //將新的節點s賦值給棧頂指標
S->count++;
return OK;
}
//出棧,刪除棧頂元素 用e返回出棧的值
Status pop(LinkStack *S, SElemType *e){
//判斷棧是否為空
if(StackEmpty(*S)){
return ERROR;
}
*e = S->top->data; //儲存要出棧的元素
LinkStackPtr p;
p = S->top; //將棧頂結點賦值給p
S->top = S->top->next; //棧頂指向下一個結點
free(p); //釋放結點p
S->count--;
return OK;
}
//遍歷棧
void stackTraverse(LinkStack S) {
if(S.count == 0){
printf("棧為空\n");
}else{
LinkStackPtr p;
p = S.top;
while(p->next){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
}
int main(void){
LinkStack S;
SElemType e;
initStack(&S);
printf("\n 1.初始化棧 \n 2.遍歷棧 \n 3.入棧 \n 4.出棧 \n 0.退出\n");
int option = 1, value;
while(option){
scanf("%d",&option);
switch(option){
case 1:
initStack(&S);
break;
case 2:
stackTraverse(S);
break;
case 3:
printf("請輸入要入棧的資料\n");
scanf("%d",&e);
push(&S, e);
stackTraverse(S);
break;
case 4:
value = pop(&S, &e);
if(value == 0){
printf("沒有可用的元素可以出棧\n");
}else{
printf("出棧的元素是:%d\n",e);
}
break;
case 0:
return OK;
}
}
return OK;
}