/*
* 该篇博客代码思想与上一篇的相似,只是自己实现了
*“stack”类,没有调用标准模板库中的<stack>类,仅此
*而已。
*/
#include "Stack.h"
#define Size 20
void PaintQuickSort(DataType digit[], int lengthOfDigit);
Position GetPosition(DataType digit[],const int low,const int high);
void QuickSort(DataType digit[], const int low, const int high);
int main(void)
{
DataType digit[Size] = {
23, 45, 56, 76, 54,
11, 3, 34, 12, 45,
89, 8, 87, 35, 45,
9, 23, 56, 56, 77};
PaintQuickSort(digit, Size);
QuickSort(digit, 0, Size-1);
PaintQuickSort(digit, Size);
return 0;
}
//输出
void PaintQuickSort(DataType digit[], int lengthOfDigit)
{
for(int i = 0; i < lengthOfDigit; i++)
cout<<digit[i]<<" ";
cout<<endl;
}
Position GetPosition(DataType digit[],const int low,const int high)
{
int i = low;
int j = high;
DataType temp = digit[low];
while(i < j)
{
while(i < j && temp < digit[j]) j--;//在标准值的右侧进行扫描
if(i < j)
{
digit[i] = digit[j];
i++;
}
while(i < j && temp > digit[i]) i++;
if(i < j)
{
digit[j] = digit[i];
j--;
}
}
digit[i] = temp;
return i;//return j;此时i == j
}
void QuickSort(DataType digit[], const int low, const int high)
{
Stack st;
Position mid;
if(low < high)
{
mid = GetPosition(digit, low, high);
if(low < mid)
{
st.StackPush(low);
st.StackPush(mid-1);
}
if(mid < high)
{
st.StackPush(mid+1);
st.StackPush(high);
}
while(!st.StackIsEmpty() && st.GetSize()%2 == 0)
{
Position top = st.GetStackTop();
st.StackPop();
Position bottom = st.GetStackTop();
st.StackPop();
mid = GetPosition(digit, bottom, top);
if(bottom < mid)
{
st.StackPush(bottom);
st.StackPush(mid-1);
}
if(mid < top)
{
st.StackPush(mid+1);
st.StackPush(top);
}
}
}
}
#ifndef _STACK_
#define _STACK_
#include <iostream>
#include <iomanip>
using namespace std;
#define MaxSize 100
typedef int DataType;
typedef int Position;
class Stack
{
private:
Position top;
int size;
DataType* stack;
public:
Stack();
Stack(int size);
~Stack();
bool StackIsEmpty();//判断栈为不为空
int GetSize()const;//获得栈的大小
void StackPush(DataType data);// 压栈
void StackPop();//出栈
DataType GetStackTop()const;//获得栈顶元素
};
#endif
#include "Stack.h"
Stack::Stack():top(0),size(0)
{
stack = new DataType[MaxSize];//默认情况下创建一个digit[MaxSize]
}
Stack::Stack(int size):top(0),size(0)
{
stack = new DataType[size];//用户指出生成digit[size]栈空间
}
Stack::~Stack()
{
delete []stack;
}
//压栈
void Stack::StackPush(DataType data)
{
stack[top] = data;
top++;
size++;
}
//出栈
void Stack::StackPop()
{
top--;
size--;
}
//获得栈顶元素
DataType Stack::GetStackTop()const
{
return stack[top-1];
}
//判断栈为不为空
bool Stack::StackIsEmpty()
{
if(size <= 0) return 1;
return 0;
}
//获得栈的大小
int Stack::GetSize()const
{
return size;
}