转载请注明出处:http://blog.csdn.net/ns_code/article/details/22518359
原文:
Write a program to sort a stack in ascending order. You should not make any assumptions about how the stack is implemented. The following are the only functions that should be used to write this program: push | pop | peek | isEmpty.
译文:
写程序将一个栈按升序排序(即元素从栈底到栈顶依次增大)。对这个栈是如何实现的,你不应该做任何特殊的假设。 程序中
能用到的栈操作有:push | pop | peek | isEmpty。
思路:
我们可以另外开辟一个空栈(最常规的思路),记当前栈为s1,新开辟的栈为s2,我们将s1的栈顶元素出栈,用一个临时变量temp保存,将它与s2的栈顶元素比较(如果s2为空,直接push进去即可),如果temp小于s2的栈顶元素,则将s2的栈顶元素出栈,而后再压入到s1中,再将此时s2的栈顶元素与temp比较,如果temp还小于该栈顶元素,则继续将该栈顶元素压入到s1中,直到temp大于s2的当前栈顶元素或者s2为空(元素全部又压回了s1中),将temp压入到s2中,这样完成了一次从s1到s2的插入操作,如此循环,直到s1为空,此时s2中的元素便按照升序排列。
实现代码:
/* 对栈进行模拟插入排序操作 */ PSTACK sort_stack(PSTACK pS) { PSTACK pS1 = create_stack(); while(!is_empty(pS)) { int pop_pSData; pop_stack(pS,&pop_pSData); while(!is_empty(pS1) && pop_pSData<pS1->pTop->data) { int pop_pS1Data; pop_stack(pS1,&pop_pS1Data); push_stack(pS,pop_pS1Data); } push_stack(pS1,pop_pSData); } return pS1; }完整代码:
/********************************************************* 题目描述: 将栈按照升序排列,升序排列的意思是元素从栈底到栈顶依次增大 Date:2014-03-29 **********************************************************/ /************************************************************************************************************** 以下为操作栈的算法,该栈为动态栈。 在该栈中,pTop指向的节点中存放该栈的栈顶数据 pBottom指向的节点的上一个节点存放该栈的栈底数据,pBottom指向的节点中不存放有效数据, 这样做的目的是为了在进行入栈和出栈时方便对栈的操作,而用考虑特殊情况 **************************************************************************************************************/ #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *pNext; }NODE,*PNODE; typedef struct Stack { PNODE pTop; PNODE pBottom; }STACK,*PSTACK; PSTACK create_stack(); void push_stack(PSTACK,int); void traverse_stack(PSTACK); bool pop_stack(PSTACK,int *); bool is_empty(PSTACK); void clear_stack(PSTACK); PSTACK sort_stack(PSTACK); int main() { //创建一个空的栈,pS指针指向该栈 PSTACK pS = create_stack(); push_stack(pS,4); push_stack(pS,3); push_stack(pS,7); push_stack(pS,1); push_stack(pS,5); push_stack(pS,9); push_stack(pS,2); push_stack(pS,6); printf("Befote Sorted:\n"); traverse_stack(pS); PSTACK pS1 = sort_stack(pS); printf("After Sorted:\n"); traverse_stack(pS1); clear_stack(pS); clear_stack(pS1); return 0; } /* 创建一个空栈,并返回指向该栈的指针 */ PSTACK create_stack() { PSTACK pS = (PSTACK)malloc(sizeof(STACK)); pS->pTop = (PNODE)malloc(sizeof(NODE)); if(NULL==pS || NULL==pS->pTop) { printf("malloc failed"); exit(-1); } else { pS->pBottom = pS->pTop; pS->pBottom->pNext = NULL; } return pS; } /* 判断该栈是否为空 */ bool is_empty(PSTACK pS) { if(pS->pTop == pS->pBottom) return true; else return false; } /* 向pS指针指向的栈中压入数据val */ void push_stack(PSTACK pS,int val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL==pNew) { printf("malloc failed"); exit(-1); } else { pNew->data = val; pNew->pNext = pS->pTop; pS->pTop = pNew; } return ; } /* 从栈中推出数据,并将推出的数据保存在pData指针所指向的位置 */ bool pop_stack(PSTACK pS,int *pData) { if(is_empty(pS)) return false; else { PNODE p = pS->pTop; *pData = p->data; pS->pTop = p->pNext; free(p); p = NULL; return true; } } /* 遍历栈,并自栈顶向栈底输出栈中的数据 */ void traverse_stack(PSTACK pS) { PNODE pCurrent = pS->pTop; while(pCurrent != pS->pBottom) { printf("%d ",pCurrent->data); pCurrent = pCurrent->pNext; } printf("\n"); return ; } /* 清空栈,即将其还原为空栈 */ void clear_stack(PSTACK pS) { if(is_empty(pS)) return ; else { PNODE p = pS->pTop; PNODE r = NULL; while(p != pS->pBottom) { r = p->pNext; free(p); p = r; } pS->pTop = pS->pBottom; } } /* 对栈进行模拟插入排序操作 */ PSTACK sort_stack(PSTACK pS) { PSTACK pS1 = create_stack(); while(!is_empty(pS)) { int pop_pSData; pop_stack(pS,&pop_pSData); while(!is_empty(pS1) && pop_pSData<pS1->pTop->data) { int pop_pS1Data; pop_stack(pS1,&pop_pS1Data); push_stack(pS,pop_pS1Data); } push_stack(pS1,pop_pSData); } return pS1; }
测试结果:
注:代码开源到Github:https://github.com/mmc-maodun/CareerCup
【CareerCup】Stacks and Queues—Q3.5,布布扣,bubuko.com
【CareerCup】Stacks and Queues—Q3.5
原文:http://blog.csdn.net/ns_code/article/details/22518359