全是bug的程式設計師_秦時小
阿新 • • 發佈:2019-01-26
/* 1 棧的順序結構實現 */
#include <stdio.h>
#include <stdbool.h>
typedef int TYPE; //定義棧元素型別
#define SIZE 5 //棧空間大小
//宣告順序棧結構體
typedef struct
{
TYPE data[SIZE];//記錄棧中元素值
int length; //記錄棧的長度
}seqStack;
void init(seqStack*);//初始化
void push(seqStack*,TYPE);//入棧
TYPE pop(seqStack*);//出棧
void clear(seqStack*);//清空
bool isEmpty(seqStack*);//判斷棧是否為空
bool isFull(seqStack*);//判斷棧是否已滿
int length(seqStack);//返回棧的大小
void ergodic(seqStack*);//遍歷棧中元素
int search(seqStack*,TYPE);//搜尋,返回是第幾個元素,失敗則返回-1
int main()
{
seqStack nodes;
//棧初始化
init(&nodes);
//元素入棧
printf("輸入要入棧的元素個數:" );
int count = 0;
scanf("%d",&count);
TYPE elem;
printf("輸入%d個入棧元素:",count);
if(count<=SIZE-length(nodes))
{
while(count)
{
scanf("%d",&elem);
push(&nodes,elem);
count--;
}
}
else
{
printf ("\n輸入資料過多或者棧已滿,入棧失敗\n");
}
//元素出棧
if(!isEmpty(&nodes))
printf("出棧元素是:%d\n",pop(&nodes));
else
printf("棧已空,出棧失敗!\n");
//搜尋元素
printf("輸入要搜尋的元素:");
scanf("%d",&elem);
int number = search(&nodes,elem);
if(number>0)
printf("找到元素%d是第%d個元素\n",elem,number);
else
printf("元素%d不存在\n",elem);
//遍歷棧
printf("遍歷棧:");
ergodic(&nodes);
//清空棧
clear(&nodes);
printf("清空後遍歷:");
ergodic(&nodes);
return 0;
}
//棧初始化
void init(seqStack* stack)
{
stack->length = 0;
}
//入棧操作
void push(seqStack* stack,TYPE e)
{
if(!isFull(stack))
{
stack->data[stack->length] = e;
stack->length++;
}
//判斷上面最後一個元素插入後,棧滿則清空緩衝區
//不能用else分支,必須用isFull再判斷一次
if(isFull(stack))
{
scanf("%*[^\n]");
scanf("%*c");
}
}
//出棧操作
TYPE pop(seqStack* stack)
{
stack->length--;
return stack->data[stack->length];
}
//判斷是否為空
bool isEmpty(seqStack* stack)
{
return stack->length==0;
}
//判斷是否為滿
bool isFull(seqStack* stack)
{
return stack->length>=SIZE;
}
//返回棧的長度
int length(seqStack stack)
{
return stack.length;
}
//遍歷棧
void ergodic(seqStack* stack)
{
for(int i=0;i<stack->length;i++)
printf("%d ",stack->data[i]);
printf("\n");
}
//搜尋棧中元素,返回元素首次在棧中出現的位置
int search(seqStack* stack,TYPE e)
{
int pos=0;
for(int i=0;i<stack->length;i++)
{
if(stack->data[i]==e)
{
pos=i+1;
break;
}
}
return pos;
}
//清空棧
void clear(seqStack* stack)
{
stack->length = 0;
}