1.棧的相關概念
????棧是一種特殊的線性表, 其中只允許在固定的一端進行插入和刪除元素.進行數據插入和刪除的一端叫做棧頂, 另一端成為棧底. 不含任何元素的棧稱為空棧, 棧又稱為先進先出的線性表.
2. 順序棧的結構
3. 順序棧的具體操作
????(1). 數據結構
typedef char SeqStackType;typedef struct SeqStack
{SeqStackType *data;int size;int capacity;
}SeqStack;
????(2).順序棧的初始化
void SeqStackInit(SeqStack* stack)
{if(stack == NULL){return;//非法輸入}stack -> size = 0;stack -> capacity = 1000;stack -> data = (SeqStackType*)malloc(( stack -> capacity ) * sizeof(SeqStack));
}
????(3). 順序棧的銷毀
void SeqStackDestroy(SeqStack* stack)
{if(stack == NULL){return;//非法輸入}free(stack -> data);stack -> size = 0;stack -> capacity = 0;
}
????(4). 順序棧的擴容
void SeqStackReSize(SeqStack* stack)
{if(stack == NULL){return;}if(stack -> size < stack -> capacity){return;}stack -> capacity = stack -> capacity * 2 + 1;SeqStackType* new_ptr = (SeqStackType*)malloc(stack -> capacity);int i = 0;for(; i < stack -> size; i++){new_ptr[i] = stack -> data[i];}}
????(5). 順序棧的入棧
void SeqStackPush(SeqStack* stack, SeqStackType value)
{if(stack == NULL){return;}if(stack -> size >= stack -> capacity){//擴容SeqStackReSize(stack);}stack -> data[stack -> size++] = value;
}
????(6). 順序棧的打印
void TestPrintChar(SeqStack* stack, char* msg)
{printf("[ %s ]\n", msg);if(stack == NULL){return;}printf("size = %d\n", stack -> size);printf("capacity = %d\n", stack -> capacity);int i = 0;for(; i < stack -> size; i++){printf("[%c] ", stack -> data[i]);}printf("\n");
}
????(7). 順序棧的出棧
void SeqStackPop(SeqStack* stack)
{if(stack == NULL){return;//非法輸入}if(stack -> size == 0){return;//空棧}stack -> size--;
}
????(8). 取棧頂元素
int SeqStackGetFront(SeqStack* stack, SeqStackType* value)
{if(stack == NULL || value == NULL){return -1;//非法輸入}if(stack -> size == 0){return -1;//空棧}*value = stack -> data[stack -> size - 1];return 0;
}
????(9). 測試代碼
//以下為測試代碼
void TestGetFront()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入棧四個元素");SeqStackType value;int ret = SeqStackGetFront(&stack, &value);printf("expected ret = 0, actual ret = %d\n", ret);printf("expected value = d, actual value = %c\n", value);
}void TestDestroy()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入棧四個元素");SeqStackDestroy(&stack);TestPrintChar(&stack, "銷毀棧");
}void TestInit()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);TestPrintChar(&stack, "初始化棧");
}void TestPop()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入棧四個元素");SeqStackPop(&stack);SeqStackPop(&stack);TestPrintChar(&stack, "出棧兩個元素");SeqStackPop(&stack);SeqStackPop(&stack);TestPrintChar(&stack, "再出棧兩個元素");SeqStackPop(&stack);TestPrintChar(&stack, "對空棧進行出棧");}void TestPush()
{SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入棧");
}int main()
{TestInit();TestPush();TestPop();TestGetFront();TestDestroy();return 0;
}