C語言_棧的基本操作(順序棧)
阿新 • • 發佈:2018-11-04
##本片部落格主要是順序棧的基本操作,包含以下內容:
初始化
入棧
出棧
判空
判滿
返回棧頂元素(棧頂元素不出棧)
返回棧頂元素(棧頂元素出棧)
###順序棧的初始化:
初始化順序棧時只需要讓棧頂等零
void InitStack (Stack *p) //初始化
{
assert (p != NULL);
p->top = 0;
}
###入棧
入棧時,將元素的值賦在top的位置,在讓top++
void PushStack (Stack *p, DataType d) //入棧 { assert (p); if (p->top == MAXSIZE) { printf ("棧滿,無法入棧!!!\n"); return; } p->data[p->top++] = d; }
###出棧:
出棧時只需要將top-1
void PopStack (Stack *p)//出棧
{
assert (p);
if (p->top == 0)
{
printf ("棧空,操作失敗!!!\n");
return;
}
p->top --;
}
###返回棧頂元素(棧頂元素不出棧):
返回棧頂元素,top的值不變
DataType TopNum (Stack *p) //返回棧頂元素(不出棧) { if (p->top == 0) { printf ("棧為空!!\n"); return 0; } return p->data[(p->top)-1]; }
###返回棧頂元素(棧頂元素出棧):
返回top的值之後讓top-1
DataType TopNumAndTop (Stack *p) //返回棧頂元素(出棧)
{
if (p->top == 0)
{
printf ("棧為空!!\n");
return 0;
}
return p->data[--(p->top)];
}
###判斷棧是否為空(為空,返回1;如果不為空,返回0):
int IsEmpty (Stack *p) // 判空
{
return (p->top == 0);//如果為空,返回1;如果不為空,返回0
}
###判斷棧是否已滿(滿了返回1,未滿返回0)
int IsFull (Stack *p) //判滿
{
return (p->top == MAXSIZE);//如果棧滿 返回1;否則返回0
}
這裡是對應的標頭檔案statck.h:
# ifndef __stack_h__
# define __stack_h__
#include <assert.h>
#include <stdio.h>
#define MAXSIZE 30
//typedef char DataType ;
typedef int DataType ;
typedef struct STACK
{
int top ; //棧頂
DataType data[MAXSIZE]; //資料
}Stack;
void InitStack (Stack *p); //初始化
void PushStack (Stack *p, DataType d); //入棧
void PopStack (Stack *p); // 出棧
int IsEmpty (Stack *p); // 判空
int IsFull (Stack *p); //判滿
DataType TopNum (Stack *p); //返回棧頂元素(不出棧)
DataType TopNumAndTop (Stack *p); //返回棧頂元素然後出棧
# endif
功能測試:
#include "statck.h"
void test1()
{
int ret = -1;
Stack stack;
InitStack (&stack);
ret = IsEmpty (&stack);
if (ret)
printf ("棧為空\n");
else
printf ("棧不為空\n");
ret = IsFull (&stack);
if (ret)
printf ("棧滿\n");
else
printf ("棧不滿\n");
//入棧
PushStack(&stack, 1);
PushStack(&stack, 2);
PushStack(&stack, 3);
PushStack(&stack, 4);
ret = IsEmpty (&stack);
if (ret)
printf ("棧為空\n");
else
printf ("棧不為空\n");
ret = IsFull (&stack);
if (ret)
printf ("棧滿\n");
else
printf ("棧不滿\n");
//出棧
PopStack (&stack);
PopStack (&stack);
ret = IsEmpty (&stack);
if (ret)
printf ("棧為空\n");
else
printf ("棧不為空\n");
ret = IsFull (&stack);
if (ret)
printf ("棧滿\n");
else
printf ("棧不滿\n");
PopStack (&stack);
PopStack (&stack);
ret = IsEmpty (&stack);
if (ret)
printf ("棧為空\n");
else
printf ("棧不為空\n");
ret = IsFull (&stack);
if (ret)
printf ("棧滿\n");
else
printf ("棧不滿\n");
}
void test2()
{
DataType ret = -1;
Stack stack;
InitStack (&stack);
ret = TopNum (&stack);
printf ("%d\n", ret);
//入棧
PushStack(&stack, 1);
PushStack(&stack, 2);
PushStack(&stack, 3);
PushStack(&stack, 4);
ret = TopNum (&stack);
printf ("%d\n", ret);
}
void test3()
{
DataType ret = -1;
Stack stack;
InitStack (&stack);
ret = TopNumAndTop (&stack);
printf ("%d\n", ret);
//入棧
PushStack(&stack, 'a');
PushStack(&stack, 'b');
PushStack(&stack, '4');
PushStack(&stack, 'd');
ret = TopNumAndTop (&stack);
printf ("%c\n", ret);
}
int main ()
{
// test1();
// test2();
test3();
return 0;
}