/*
*創建鏈棧
*創建一個top指針代表head指針
*採用鏈式存儲結構
*採用頭插法創建鏈表
*操作 創建 出棧 入棧 取棧頂元素
*創建數據域的結構體
*創建數據域的名稱指針
*使用隨機函數對數據域的編號進行賦值
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define NAMESIZE 255//字符串的最大長度
int count=0;//鏈棧中數據元素的個數
typedef int IdType;//數據域的數據類型
typedef char *NameType;//數據域名稱的數據類型
typedef int Statu;//函數返回值的數據類型
typedef struct elementtype
{
IdType id;
NameType name;//數據域的名稱的指針
}ElementType;
typedef struct linkstack
{
ElementType *data;//數據域指針
struct linkstack *next;//指向下一個節點的指針
}Link_Stack;//鏈棧的結構體
Statu create_linkstack(Link_Stack *top);//鏈棧的創建
void Init_linkstack(Link_Stack *top);//鏈棧的初始化
Statu push_linkstack(Link_Stack *top,ElementType key);//入棧
Statu pop_linkstack(Link_Stack *top,ElementType *key);//出棧
Statu getdata_linkstack(Link_Stack*top,ElementType *data);//取棧頂元素
Statu empty_linkstack(Link_Stack*top);//判斷棧是否爲空
void Display_linkstack(Link_Stack *top);//遍歷棧中的數據
void main()
{
Link_Stack *top;
ElementType data;//入棧的數據
ElementType data1;//出棧的元素
ElementType key;//取棧頂元素
top=(Link_Stack*)malloc(sizeof(Link_Stack));
//對鏈棧進行初始化
Init_linkstack(top);
int result=create_linkstack(top);
if(result==ERROR)
{
printf("鏈棧創建失敗\n");
}
else
{
printf("鏈棧創建成功\n");
printf("鏈棧中數據元素的個數爲:%d\n",count);
}
if(empty_linkstack(top))
printf("鏈棧爲空\n");
else
printf("鏈棧不爲空\n");
data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
data.id=rand()%50;
printf("請輸入入棧的數據的名稱:");
scanf("%s",data.name);
int result1=push_linkstack(top,data);
if(result1==ERROR)
printf("入棧失敗\n");
else
printf("入棧成功\n");
data1.name=(NameType)malloc(sizeof(char)*NAMESIZE);
int result2=pop_linkstack(top,&data1);
if(result2==ERROR)
{
printf("出棧失敗\n");
}
else
{
printf("出棧成功\n");
printf("出棧的元素爲[%s,%d]\n",data1.name,data1.id);
}
key.name=(NameType)malloc(sizeof(char)*NAMESIZE);
int result3=getdata_linkstack(top,&key);
if(result3==ERROR)
printf("取棧頂元素失敗\n");
else
{
printf("取棧頂元素成功\n");
printf(" 棧頂元素爲:[%s,%d]\n",key.name,key.id);
}
printf("棧中數據遍歷的結果爲\n");
Display_linkstack(top);
}
void Init_linkstack(Link_Stack*top)//鏈棧的初始化
{
if(top==NULL)
{
printf("鏈棧初始化失敗\n");
return ;
}
else
{
top->next=NULL;
}
}
Statu create_linkstack(Link_Stack *top)//鏈棧的創建
{
if(top==NULL)
return ERROR;
Link_Stack *s;
char name[NAMESIZE];
s=(Link_Stack*)malloc(sizeof(Link_Stack));
if(s==NULL)
return NULL;
printf("請輸入數據域的名稱:\n");
while(scanf("%s",name)!=EOF)
{
if(strcmp(name,"^")==0)
break;
else if(s==NULL)
break;
else
{
s->data=(ElementType*)malloc(sizeof(ElementType));
s->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
strcpy(s->data->name,name);
s->data->id=rand()%30;//data爲數據域指針 所以全部使用箭頭指向
s->next=top->next;
top->next=s;
count++;//數據元素++
}
s=(Link_Stack*)malloc(sizeof(Link_Stack));
}
return OK;
}
Statu empty_linkstack(Link_Stack*top)//判斷棧是否爲空
{
if(top->next==NULL)
{
return OK;
}
else
{
return ERROR;
}
}
Statu push_linkstack(Link_Stack *top,ElementType key)//入棧
{
if(top==NULL)
return ERROR;
Link_Stack *s;
s=(Link_Stack*)malloc(sizeof(Link_Stack));
s->data=(ElementType*)malloc(sizeof(ElementType));
s->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
s->data->id=key.id;
strcpy(s->data->name,key.name);
s->next=top->next;
top->next=s;
return OK;
}
Statu pop_linkstack(Link_Stack *top,ElementType *key)//出棧
{
Link_Stack*node;
if(empty_linkstack(top))
{
return ERROR;
}
else
{
node=top->next;
key->id=node->data->id;
strcpy(key->name,node->data->name);
top->next=node->next;
free(node);//釋放其內存
}
}
Statu getdata_linkstack(Link_Stack*top,ElementType *data)//取棧頂元素
{
//取棧頂元素
if(empty_linkstack(top))
return ERROR;
else
{
Link_Stack*node;
node=top->next;
data->id=node->data->id;
strcpy(data->name,node->data->name);
return OK;
}
}
void Display_linkstack(Link_Stack *top)//遍歷棧中的數據
{
ElementType data;//出棧的數據
//對棧進行判斷是否爲空
if(empty_linkstack(top))
return ;
else
{ while(empty_linkstack(top)!=1)
{
data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
if(pop_linkstack(top,&data))
printf("[%s,%d]\t",data.name,data.id);
}
}
}