代碼
#include <stdio.h>
#include <stdlib.h>/************************************************************************/
/*棧應用示例--數制轉換要求:輸入任意的正整數N(十進制),分別輸出該整數的二進制、八進制、十六進制的結果算法公式:N = (N div d) * d + N mod d (div表示整除,mod表示求余)(216)(十進制) = (330)(八進制) = (D8)(十六進制) = (11011000)(二進制)短除法N N div 8 N mod 8 216 27 027 3 33 0 3N N div 16 N mod 16216 13 813 0 D注意:十六進制的數字組成:0 1 2 3 4 5 6 7 8 9 A B C D E F關于進制間轉換:《七日成蝶-C語言編程基礎視頻課程》
*/
/************************************************************************/#define STACK_CAPACITY 25typedef struct tag_stack
{char *pBuffer; //指向棧中用于存放數據的內存int top; //棧頂int length; //棧中實際元素個數
}Stack;bool InitStack(Stack **pStack); //分配內存初始化棧空間,設定棧容量,棧頂
void DestroyStack(Stack *pStack); //回收棧空間內存
bool StackEmpty(Stack *pStack); //判定棧是否為空,為空返回true,非空返回false
bool StackFull(Stack *pStack); //判定棧是否已滿,為滿返回true,不滿返回false
void ClearStack(Stack *pStack); //清空棧
int StackLength(Stack *pStack); //已有元素的個數
bool Push(Stack *pStack, char *elem); //元素入棧,棧頂上升
bool Pop(Stack *pStack,char *elem); //元素出棧,棧頂下降
void StackTraverse(Stack *pStack, bool isFromButtom); //遍歷棧中所有元素bool InitStack(Stack **pStack)
{*pStack = (Stack *)malloc(sizeof(Stack));if(*pStack == NULL){return false;}(*pStack)->pBuffer = (char *)malloc(sizeof(char) * STACK_CAPACITY);if((*pStack)->pBuffer == NULL){return false;}//(*pStack)->top = 0;//(*pStack)->length = 0;ClearStack(*pStack);return true;
}void DestroyStack(Stack *pStack)
{free(pStack->pBuffer);pStack->pBuffer = NULL;free(pStack);pStack = NULL;
}void ClearStack(Stack *pStack)
{pStack->length = 0;pStack->top = 0;
}bool StackEmpty(Stack *pStack)
{if(pStack->length == 0){return true;}return false;
}bool StackFull(Stack *pStack)
{if(pStack->length == STACK_CAPACITY){return true;}return false;
}int StackLength(Stack *pStack)
{return pStack->length;
}bool Push(Stack *pStack, char *elem)
{if(StackFull(pStack)){return false;}pStack->pBuffer[pStack->top] = *elem;pStack->top++;pStack->length++;return true;
}bool Pop(Stack *pStack,char *elem)
{if(StackEmpty(pStack)){return false;}pStack->top--;*elem = pStack->pBuffer[pStack->top];pStack->length--;return true;
}void StackTraverse(Stack *pStack, bool isFromButtom)
{if(isFromButtom){for(int i = 0; i < pStack->length; i++){printf("%c", pStack->pBuffer[i]);}}else{for (int i = pStack->top - 1; i >= 0; i--){printf("%c", pStack->pBuffer[i]);}}
}int main(void)
{Stack *myStack = NULL;int num = 216;int P = 2;char str[] = "0123456789ABCDEF";if(InitStack(&myStack)){while(num != 0){Push(myStack, &(str[num % P]));num = num / P;}StackTraverse(myStack, false);DestroyStack(myStack);}system("pause");return 0;
}
復合類型棧編碼
- pStack->pBuffer[pStack->top].x = elem->x;
- pStack->pBuffer[pStack->top].y = elem->y;
- 等效于
- pStack->pBuffer[pStack->top]?= *elem;
- 因為 結構體Coordinate 僅僅包含 int類型,不涉及復雜的指針操作,直接賦值即可
#include <stdio.h>
#include <stdlib.h>/************************************************************************/
/* 坐標棧實現操作坐標數據類型的棧坐標為二維坐標{x, y}
*/
/************************************************************************/typedef struct tag_coordinate
{int x;int y;
}Coordinate;void printCoordinate(Coordinate *coor)
{printf("(%d, %d)\n", coor->x, coor->y);
}#define STACK_CAPACITY 5typedef struct tag_stack
{Coordinate *pBuffer; //指向棧中用于存放數據的內存int top; //棧頂int length; //棧中實際元素個數
}Stack;bool InitStack(Stack **pStack); //分配內存初始化棧空間,設定棧容量,棧頂
void DestroyStack(Stack *pStack); //回收棧空間內存
bool StackEmpty(Stack *pStack); //判定棧是否為空,為空返回true,非空返回false
bool StackFull(Stack *pStack); //判定棧是否已滿,為滿返回true,不滿返回false
void ClearStack(Stack *pStack); //清空棧
int StackLength(Stack *pStack); //已有元素的個數
bool Push(Stack *pStack, Coordinate *elem); //元素入棧,棧頂上升
bool Pop(Stack *pStack,Coordinate *elem); //元素出棧,棧頂下降
void StackTraverse(Stack *pStack, bool isFromButtom); //遍歷棧中所有元素bool InitStack(Stack **pStack)
{*pStack = (Stack *)malloc(sizeof(Stack));if(*pStack == NULL){return false;}(*pStack)->pBuffer = (Coordinate *)malloc(sizeof(Coordinate) * STACK_CAPACITY);if((*pStack)->pBuffer == NULL){return false;}//(*pStack)->top = 0;//(*pStack)->length = 0;ClearStack(*pStack);return true;
}void DestroyStack(Stack *pStack)
{free(pStack->pBuffer);pStack->pBuffer = NULL;free(pStack);pStack = NULL;
}void ClearStack(Stack *pStack)
{pStack->length = 0;pStack->top = 0;
}bool StackEmpty(Stack *pStack)
{if(pStack->length == 0){return true;}return false;
}bool StackFull(Stack *pStack)
{if(pStack->length == STACK_CAPACITY){return true;}return false;
}int StackLength(Stack *pStack)
{return pStack->length;
}bool Push(Stack *pStack, Coordinate *elem)
{if(StackFull(pStack)){return false;}//pStack->pBuffer[pStack->top] = *elem;pStack->pBuffer[pStack->top].x = elem->x;pStack->pBuffer[pStack->top].y = elem->y;pStack->top++;pStack->length++;return true;
}bool Pop(Stack *pStack,Coordinate *elem)
{if(StackEmpty(pStack)){return false;}pStack->top--;*elem = pStack->pBuffer[pStack->top];pStack->length--;return true;
}void StackTraverse(Stack *pStack, bool isFromButtom)
{if(isFromButtom){for(int i = 0; i < pStack->length; i++){//printf("%c ", pStack->pBuffer[i]);//printf("(%d, %d)\n", pStack->pBuffer[i].x, pStack->pBuffer[i].y);printCoordinate(&(pStack->pBuffer[i]));}}else{for (int i = pStack->top - 1; i >= 0; i--){//printf("%c ", pStack->pBuffer[i]);//printf("(%d, %d)\n", pStack->pBuffer[i].x, pStack->pBuffer[i].y);printCoordinate(&(pStack->pBuffer[i]));}}
}int main(void)
{Stack *myStack = NULL;Coordinate ch1 = {2, 3};Coordinate ch2 = {4, 5};Coordinate ch3 = {6, 7};Coordinate ch4 = {8, 9};Coordinate ch5 = {1, 0};Coordinate ch = {0, 0};if(InitStack(&myStack)){if(StackEmpty(myStack)){printf("\n當前棧為空\n");}Push(myStack, &ch1);Push(myStack, &ch2);Push(myStack, &ch3);Push(myStack, &ch4);Push(myStack, &ch5);StackTraverse(myStack, true);if(StackFull(myStack)){printf("\n當前棧為滿\n");}Pop(myStack, &ch);printCoordinate(&ch);StackTraverse(myStack, false);printf("StackLength = %d\n", StackLength(myStack));DestroyStack(myStack);}system("pause");return 0;
}
?